在 catchError 之后不会执行 redux-observable

Posted

技术标签:

【中文标题】在 catchError 之后不会执行 redux-observable【英文标题】:redux-observable wont be execute after catchError 【发布时间】:2019-02-17 21:00:02 【问题描述】:

我在我的 Angular 项目中使用 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));
    )
  );

【问题讨论】:

【参考方案1】:

如果您的 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 连接即可。

【讨论】:

谢谢!我添加了捕捉错误,但同样发生了。不确定,但您能否告诉我添加代码时我的代码如何?也许我错了! 谢谢!我已经改变了,但我有类型错误。 Type 'UnaryFunction&lt;Observable&lt;&gt;, Observable&lt;&gt;&gt;' is not assignable to type 'ObservableInput&lt;&gt;'.【参考方案2】:

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

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

请参阅docs 了解更多信息。

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

【讨论】:

谢谢!但我遇到了另一个错误,说我无法在 setter 上设置值:( 我错了,你必须在服务调用中这样做,我没有看到第二个平面图。查看更新的答案 我在服务中做了但没有结果。

以上是关于在 catchError 之后不会执行 redux-observable的主要内容,如果未能解决你的问题,请参考以下文章

从角度服务通过管道传输时,rxjs catchError 不起作用

如果条件,Redux 在其他操作之后调用操作

Redux dispatch 永远不会在 React Native 应用程序中运行

Redux 状态在下一个 js 调度后不会改变

再探Redux Middleware

在 redux store 更新后立即执行自定义回调