效果:
@Effect()
loadDocsEffect$ = this.actions$.pipe(
ofType(myActionTypes.LoadDocs),
mergeMap(action => this.myService.getDocs()),
map(data => new LoadDocsSuccess(data)),
catchError(error => Observable.of(new LoadDocsFailure(error)))
);
当我返回数据时它起作用,但是当服务器响应错误(例如404)时,可观察值已完成,并且在我第二次调度操作时不会触发效果。我寻找一种可以正确处理错误并继续观察到的流的方法,以便可以在我的组件中订阅它并采取相应的措施。
@ngrx Effect does not run the second time中的解决方案对我不起作用,或者我无法使其起作用。
答案 0 :(得分:5)
您需要应要求catchError
而不是actions$
。为此,您将需要如下修改代码:
mergeMap(action =>
this.myService.getDocs().pipe(
map(data => new LoadDocsSuccess(data)),
catchError(error => Observable.of(new LoadDocsFailure(error)))
)
)
答案 1 :(得分:1)
我向您保证这是正确的方法。我怎么知道?关于ngrx Udemy课程中的确切问题,有很长的讨论,这是他们提供的解决方案。请注意,使用catchError
是必不可少的,否则HTTP错误响应(任何非2xx响应)将禁用此效果。
@Effect()
loadDocsEffect$ = this.actions$.pipe(
ofType(myActionTypes.LoadDocs),
mergeMap((action) => {
// essential to catchError else an HTTP error response will disable this effect
return this.myService.getDocs().pipe(
map(data => new LoadDocsSuccess(data)),
catchError((err) => {
return of(null)
})
)
}),
tap(res => console.log(res)) // you won't want this line but useful for debugging
);
在此示例中,如果HTTP请求成功,则new LoadDocsSuccess(data)
的结果将记录在tap内部。如果HTTP请求失败,则null
将记录在tap内部。当然,您可能想提供一些不同的catchError逻辑,但您会明白。