我使用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
函数组合)?
答案 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)
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));