【问题标题】:catch error and emit different action when handling ngrx-effects在处理 ngrx 效果时捕获错误并发出不同的操作
【发布时间】:2018-02-23 10:01:07
【问题描述】:

在下面的代码 sn-p 中,如果更新操作成功,我想发出 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 操作也不会发出。

感谢任何帮助。

【问题讨论】:

    标签: rxjs ngrx ngrx-effects


    【解决方案1】:

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

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

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

    其他资源

    1. 这里有更多关于difference between mergeMap and map的信息。
    2. mergeMap 的官方文档。
    3. @ngrx/effects README 中使用此方法的@Effect 示例。

    【讨论】:

    • 感谢您的回答,文斯。您的 sn-p 缺少dataService.updateData() 所需的用户值。我已将其修改为dataUpdate$=this.authService.getUser().map(user => this.dataService.updateData(action.payload, user)),但仍未发出 BackendError 操作。我试图在Observable.fromPromise() 中包含对updateData() 的调用,因为updateData() 方法返回一个承诺,但这也不起作用。
    • 没问题!我编辑了我的答案以反映你想要做什么。我认为您只需要另一个mergeMap 而不是map。查看我更新的答案,让我知道这是否适合您。
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多