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

时间:2019-03-22 14:51:43

标签: angular observable ngrx ngrx-effects

调用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)除了将模型发送到后端(并返回可观察对象)之外,什么也不做。

有人能指出我问题的正确方向吗?谢谢!

2 个答案:

答案 0 :(得分:1)

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。如果它们具有相同的原始值,那么您将继续调度相同的操作。

答案 1 :(得分:0)

我遇到了同样的问题,效果陷入了无限循环,而take(1)解决了它只能调度一次的问题。

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

这应该工作得很好,因此,在效果或动作无限循环的情况下,请检查常量类型:)

祝大家好运!