如何为所有redux-observable史诗添加全局错误处理程序?

时间:2016-09-14 20:59:39

标签: react-native redux-observable

我使用redux-observable处理React Native应用程序。我有10个以上的史诗,都以.catch(err => console.error(err))结尾,以便在史诗内部出现错误的情况下显示React Native“Red box”(参见https://facebook.github.io/react-native/docs/debugging.html#errors)。

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

2 个答案:

答案 0 :(得分:10)

redux-observable倾向于RxJS的惯用范例几乎所有你要做的事情。将Epics组合在一起时,您将创建一个具有正常function (action$, store)签名的新Epic。因此,这个新的Epic代表了各个Epics的所有输出,包括错误。

您可以通过定义自己的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()用于返回其他一些Observable,以便在出现错误时使用。如果您只想记录错误(而不是尝试恢复),.do()是理想的操作符 - 它的目的是允许您执行没有的外部副作用(如日志记录)对流本身的影响。

撰写史诗是非常强大的,不仅仅是在这种情况下,还有很多其他我们计划很快描述的内容。

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

答案 1 :(得分:1)

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