如何用ngrx捕获错误

时间:2018-02-01 01:31:37

标签: redux ngrx ngrx-effects

我试图用ngrx和angularfire2 firetore捕获错误。

这是效果

@Effect()
        delete$: Observable<Action> = this.actions$
        .ofType(actions.DELETE)
        .map((action: actions.Delete) => action.id)
        .mergeMap(id => 
         of(this.afs.doc<Collection(`collections/${id}`).delete()))
        .map(() =>  new actions.Success())
        .catch(err => of (new actions.Fail(err.message )));

和行动:

export class Success implements Action {
  readonly type = SUCCESS;
  constructor() {
    console.log('success')
   }
}


export class Fail implements Action {
  readonly type = ERROR;

  constructor(public payload: any) {
    console.log('failed');
 }
}

即使行动没有完成,我也会继续取得成功。这样做的好方法是什么?

1 个答案:

答案 0 :(得分:1)

目前,此代码试图捕获整个流上的错误,而不是重要的内部可观察对象。

试试这个:

@Effect delete$: Observable<Action> = this.action$
  .ofType(actions.DELETE)
  .map((action: actions.Delete) => action.id)
  .mergeMap(id => { 
    return of(this.afs.doc<Collection(`collections/${id}`).delete())
      .map(() =>  new actions.Success())
      .catch(err => of(new actions.Fail(err.message))
  });

请参阅mergeMapthis helpful answer on SO about it上的文档。可能引发错误的流是内部of(this.afs.doc...)可观察对象,因此.catch应该在该可观察对象上。在当前的实现中(来自上面的示例),无论是否失败,它始终map of(this.afs.doc...)的结果new actions.Success()