наблюдаемая избыточность не будет выполняться после catchError - PullRequest
0 голосов
/ 13 сентября 2018

Я использую наблюдаемую редукцию в моем угловом проекте.В моих эпосах есть функция updateNode с обработкой catchError.Я отправляю действие DB_UPDATE_NODE много раз, и все работает хорошо.Однако временное действие, выполняемое catchError, когда я отправляю это действие снова, функция updateNode больше не будет вызываться.

  public updateNode(action$: Observable<IScenarioNodesAction>, store: Store<IAppState>){
    return action$.pipe(
      ofType(ScenarioNodeActionType.DB_UPDATE_NODE),
      flatMap((action) => {
       return  this._scenarioNodeService.update(action.payload.botId);
      }),
        flatMap(data => [
          this._scenarioNodeAction.updateNode(data),
        ]) ,
        catchError((error) => { 
           return Observable.of(this._commonAction.showError(error));
          })
    );

  } 

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вы должны отловить ошибку в потоке службы.

flatMap((action) => {
  return this._scenarioNodeService.update(action.payload.botId)
             .pipe(catchError(...)) ;
})

См. документы для получения дополнительной информации.

Здесь мы поместили catchError () внутри нашей mergeMap (), но после нашего вызова AJAX; это важно, потому что если мы позволим ошибке достичь действия $ .pipe (), она прекратит его и больше не будет прослушивать новые действия.

0 голосов
/ 13 сентября 2018

Если ваш наблюдаемый возвращает ошибки, он не дает наблюдателю получать новые события.

Пожалуйста, добавьте в catchError что-то вроде:

  public updateNode(action$: Observable<IScenarioNodesAction>, store: Store<IAppState>){
    return action$.pipe(
      ofType(ScenarioNodeActionType.DB_UPDATE_NODE),
      flatMap((action) => {
       return  this._scenarioNodeService.update(action.payload.botId);
      }),
        flatMap(data => [
          this._scenarioNodeAction.updateNode(data),
        ]) ,
        catchError((error) => { 
              retryWhen((errors) => {
               return errors
                .pipe(delay(1000), take(1))
                .concat(Observable.throw(`Error`));
            },
        ),
      })
    );

  } 

Что из вышеперечисленного делает, он ждет секунду delay(1000) и повторяет количество раз take(1).Если ошибка повторяется, выдается ошибка .concat(Observable.throw('Error')).В вашем случае вы просто звоните showError и drop на соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...