效果卡在一个无限循环中 - Ngrx/效果



当调用new SaveModelAction()时,相应的效果会卡在无限循环中。

这个效果:

@Effect() saveModelAction = this.action$.pipe(
    ofType(SAVE_MODEL),
    switchMap((action: any) => {
      const storageMetaData: StorageData = action.payload;
      return this.modelService.loadState()
        .pipe(
          switchMap((state: State) => {
            const model: Model = AnalysisUtils.convertStateToModel(state, storageMetaData);
            return this.modelService.saveModel(model)
              .pipe(
                map(() => new SavingModelCompleteAction),
                catchError((error: Error) => this.createErrorObservableAndLog(error))
              );
          }),
          catchError((error: Error) => this.createErrorObservableAndLog(error))
        );
    })
  );

附加信息:

  1. 在相关组件中,SaveModelAction仅分散一次。
  2. 当订阅 this.modelService.loadState() 的状态时,使用 take(1)
  3. 除了将模型发送到后端(并返回可观察量(之外,this.modelService.saveModel(model)什么都不做。

谁能指出我的问题的正确方向?谢谢!

switchMap有不同的目的。

如我所见,您只想扁平化可观察量,因此您应该使用 flatMapmergeMap 而不是 switchMap 。有关这些运算符的更多信息:https://www.learnrxjs.io/operators/transformation/switchmap.html

尝试这样的事情:

@Effect() saveModelAction = this.action$.pipe(
ofType(SAVE_MODEL),
mergeMap((action: any) => {
  const storageMetaData: StorageData = action.payload;
  return this.modelService.loadState()
    .pipe(
      mergeMap((state: State) => {
        const model: Model = AnalysisUtils.convertStateToModel(state, storageMetaData);
        return this.modelService.saveModel(model)
          .pipe(
            map(() => new SavingModelCompleteAction),
            catchError((error: Error) => this.createErrorObservableAndLog(error))
          );
      }),
      catchError((error: Error) => this.createErrorObservableAndLog(error))
    );
})
);

此外,常量具有相同的原始值也是一个常见的错误。在您的情况下,请检查SAVE_MODEL_COMPLETE != SAVE_MODEL。如果它们具有相同的基元值,则继续调度相同的操作。

我遇到了同样的问题,效果卡在一个无限循环中,take(1( 解决了它只调度一次。

问题是我有 2 个具有相同类型的操作:(

这应该可以完美地工作,因此在效果或动作无限循环的情况下,请检查常量类型:)

祝大家好运!

相关内容

  • 没有找到相关文章

最新更新