redux-observable不会在catchError之后执行

问题描述 投票:2回答:2

我在我的角度项目中使用redux-observable。我的史诗中有updateNode功能,catchError处理。我多次派遣行动DB_UPDATE_NODE,一切顺利。然而,当我再次发送该动作时,时间动作执行catchErrorupdateNode函数不再被调用。

  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));
          })
    );

  } 
angular redux rxjs redux-observable
2个回答
0
投票

您必须捕获服务流上的错误。

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

有关更多信息,请参阅docs

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


0
投票

如果您的observable返回错误,它会阻止观察者获取新事件。

请添加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连接。

© www.soinside.com 2019 - 2024. All rights reserved.