捕获错误并在处理ngrx效果时发出不同的操作

时间:2018-02-23 10:01:08

标签: rxjs ngrx ngrx-effects

在下面的代码段中,如果更新操作成功,我想发出GetData操作,如果不成功,我想发出BackendError操作。

@Effect()
updateData$ = this.actions$.pipe(
  ofType(MyActionType.UPDATE_DATA),
  map((action: UpdateData) => action.payload),
  combineLatest(this.authService.getUser(), (myData, user) => this.dataService.updateData(myData, user)),
  map(() => new GetData()),
  catchError((err) => { of(new BackendError(err)))
);

以上代码似乎不起作用。即使更新操作因权限错误而失败,也不会发出BackendError操作。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您当前的实现将吞噬updateData操作上的错误,因为action$(外部可观察对象)被映射到new GetData()操作,无论{{1}的结果如何操作(成功或失败)。

在下面的实现中,updateData运算符将运行catchError操作(updateData - 内部observable)抛出错误..

dataUpdate$

其他资源

  1. 以下是difference between mergeMap and map
  2. 的更多信息
  3. mergeMap的官方文档。
  4. @Effect() updateData$ = this.actions$.pipe( ofType(MyActionType.UPDATE_DATA), mergeMap((action: UpdateData) => { const user$ = this.authService.getUser(); const dataUpdate$ = user$.pipe( mergeMap(user => this.dataService.updateData(action.payload, user)); ); return dataUpdate$.pipe( map(() => new GetData()), catchError(err => of(new BackendError(err))) ); }) ); @Effect使用此方法的示例。