我试图用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');
}
}
即使行动没有完成,我也会继续取得成功。这样做的好方法是什么?
答案 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))
});
请参阅mergeMap
和this helpful answer on SO about it上的文档。可能引发错误的流是内部of(this.afs.doc...)
可观察对象,因此.catch
应该在该可观察对象上。在当前的实现中(来自上面的示例),无论是否失败,它始终map
of(this.afs.doc...)
的结果new actions.Success()
。