redux-observable 无法从发出的动作中捕获错误,错误会停止动作流

Posted

技术标签:

【中文标题】redux-observable 无法从发出的动作中捕获错误,错误会停止动作流【英文标题】:redux-observable can't catch error from emitted action, error stops action stream 【发布时间】:2019-04-09 09:30:15 【问题描述】:

如果一个 js 错误是由于 redux-observable 史诗中发出的动作而发生的,那么它会阻止所有史诗监听新的动作。这很糟糕,因为在前端它仍然看起来好像应用程序正在运行,但在后台没有保存任何内容。

我尝试在我的史诗中捕获错误,但由于某种原因,它没有捕获由生成的发出操作引起的错误(请参见此处的示例:https://stackblitz.com/edit/redux-observable-playground-qtughj?file=ping-pong.js)

我认为升级到版本 1.0.0 redux-observable 可以解决这个问题,但不幸的是它仍然存在。

有什么方法可以捕获由 redux-observable 发出的动作引起的错误?

该问题与this question 不同,因为该错误是在reducer 中触发的,该reducer 是在史诗发出其输出redux 操作之后发生的,因此在可观察链中用.error 捕获它不起作用(请参阅@ 987654323@ 进行演示)。

谢谢!

【问题讨论】:

【参考方案1】:

在redux-observable Github repo 中讨论了这个问题之后,最安全的解决方案似乎是创建一些自定义 Redux 中间件来阻止错误一直冒泡到根史诗,例如

const store = createStore(rootReducer,
  applyMiddleware(epicMiddleware, store => next => action => 
    try 
      next(action);
     catch (e) 
      setTimeout(() => 
        throw e;
      );
    
  )
);

【讨论】:

以上是关于redux-observable 无法从发出的动作中捕获错误,错误会停止动作流的主要内容,如果未能解决你的问题,请参考以下文章

如何从 typesafe redux-observable epic 中收听“@@router/LOCATION_CHANGE”动作

Redux-observable:当动作完成时组件如何订阅响应?

如何在ngrx/effect(redux-observable)中调度多个动作?

在 redux-observable 中,我如何控制 reducer 或 epics 是不是首先对动作做出反应?

在 catchError 之后不会执行 redux-observable

redux-observable - 在单个史诗中调度多个 redux 操作