在catchError之后将无法执行redux-observable

时间:2018-09-13 07:12:45

标签: angular redux rxjs redux-observable

我在我的角度项目中使用了redux-observable。我的史诗中有一个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 :(得分:0)

如果您的可观察对象返回错误,它将阻止观察者获取新事件。

请在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'))。就您而言,您只需呼叫showErrordrop连接即可。

答案 1 :(得分:0)

您必须在服务流中捕获错误。

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

有关更多信息,请参见docs

  

在这里,我们将catchError()放置在mergeMap()内,但是在AJAX调用之后;这很重要,因为如果我们让错误到达action $ .pipe(),它将终止该错误,并且不再侦听新操作。