效果陷入无限循环 - Ngrx/effects

Effect is stuck in an infinite loop - Ngrx/effects

调用new SaveModelAction()时,相应的Effect陷入死循环。

这个效果:

@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 有不同的目的。

如我所见,你只是想扁平化 Observables,所以你应该使用 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。如果它们具有相同的原始值,那么您将继续调度相同的操作。

我遇到了同样的问题,effect 陷入了无限循环,take(1) 只派发了一次就解决了。

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

这应该可以完美运行,所以如果效果或动作无限循环,请检查常量类型:)

祝大家好运!