Error Handling

在 Epics 中处理像 AJAX 调用这种副作用中的错误是一个很常见的需求。尽管有多种方式可以实现,这取决于你的需求,最常见的方式是在 Epic 内部捕获错误并且发出
带有错误信息的 action 便于展现或者日志记录。

这可以通过 RxJS 的操作符 .catch() 来完成:

  1. import { ajax } from 'rxjs/observable/dom/ajax';
  2. const fetchUserEpic = action$ =>
  3. action$.ofType(FETCH_USER)
  4. .mergeMap(action =>
  5. ajax.getJSON(`/api/users/${action.payload}`)
  6. .map(response => fetchUserFulfilled(response))
  7. .catch(error => Observable.of({
  8. type: FETCH_USER_REJECTED,
  9. payload: error.xhr.response,
  10. error: true
  11. }))
  12. );

这里我们将 .catch() 放到了 .mergeMap() 内部,AJAX 调用的后面; 这很重要因为如果让错误到达 action$.ofType(),epic 会终止并且不会监听任何 actions。


Try It Live!

View this demo on JSBin