Эффект застрял в бесконечном цикле - Ngrx / эффекты - PullRequest
0 голосов
/ 22 марта 2019

Когда вызывается 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) ничего не делает, кроме отправки модели в бэкэнд (и возврата наблюдаемой.

Может кто-нибудь указать мне правильное направление, где моя проблема? Спасибо!

1 Ответ

1 голос
/ 22 марта 2019

switchMap имеет другое назначение.

Как я вижу, вы просто хотите сгладить Observables, поэтому вы должны использовать flatMap или mergeMap вместо 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. Если они имеют одинаковое примитивное значение, вы продолжаете отправлять одно и то же действие.

...