10

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

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

4

2 回答 2

12

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

编写 Epics 非常强大,不仅在这种情况下,而且我们计划很快描述的许多其他情况。

.catch()运算符相关,您可能还对RFC 感兴趣,以便更好地处理默认错误

于 2016-09-14T21:27:16.127 回答
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-05-26T14:23:53.357 回答