【问题标题】:How to add a global error handler for all redux-observable epics?如何为所有 redux-observable 史诗添加全局错误处理程序?
【发布时间】:2017-01-22 19:09:49
【问题描述】:

我使用 redux-observable 开发一个 React Native 应用程序。我有 10 多个史诗,都以 .catch(err => console.error(err)) 结尾,以便在史诗内部出现错误时显示 React Native“红框”(参见 https://facebook.github.io/react-native/docs/debugging.html#errors)。

如何定义一个全局错误处理程序,供所有史诗使用(它们稍后由combineEpics 函数组合)?

【问题讨论】:

    标签: react-native redux-observable


    【解决方案1】:

    redux-observable 几乎所有你会做的事情都依赖于 RxJS 的惯用范式。当您将 Epic 组合在一起时,您将创建一个具有正常 function (action$, store) 签名的新 Epic。所以这个新的 Epic 代表了这些单独 Epic 的所有输出,包括错误。

    您可以通过定义自己的rootEpic 并编写combineEpics() 调用的结果来利用这一事实。由于 Epics 是工厂,因此您需要记住传递 (action$, store)

    这是一种方法:

    export const rootEpic = (action$, store) =>
      combineEpics(epic1, epic2, epic3)(action$, store) // <-- call epic w/ args
        .do({ error: err => console.error(err) });
    

    您可能不应该为此使用.catch() 运算符,因为.catch() 是为了在出现错误时返回其他一些可观察的对象。如果您只想记录错误(而不是尝试恢复),.do() 是理想的运算符——它的目的是允许您执行对流本身没有影响的外部副作用(如日志记录)。

    编写 Epics 非常强大,不仅在本例中,还有许多其他我们计划很快描述的情况。

    .catch() 运算符相关,您可能还对the RFC for better default error handling 感兴趣。

    【讨论】:

    • 感谢您的回复和其他提示。你的解决方案就像一个魅力。
    • 自 rxjs v6 以来对此有何变化?
    • @zhuber 如果您不想以任何方式处理错误,包括不“重新启动”您的史诗,v6 中的唯一区别是 do -> tap and catch -> catchError, as pipeable运算符而不是方法。
    【解决方案2】:

    2020 年更新

    import { concat, of } from 'rxjs';
    import { combineEpics } from 'redux-observable';
    import { catchError } from 'rxjs/operators';
    
    export const rootEpic = (action$, store) =>
      combineEpics(epic1, epic2, epic3)(action$, store)
        .pipe((error, caught) => concat(caught));
    
    import { createEpicMiddleware } from 'redux-observable';
    const epicMiddleware = createEpicMiddleware();
    epicMiddleware.run((action$, store) => rootEpics(action$, store));
    

    您还可以像这样传递 redux 错误操作:

    concat(of(reduxActionForError), caught));
    

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 2023-04-04
      • 1970-01-01
      • 2021-11-13
      • 2019-01-23
      • 2017-04-22
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      相关资源
      最近更新 更多