为什么动作在第二次运行时不会触发效果?

时间:2018-10-06 22:02:25

标签: angular rxjs observable ngrx ngrx-effects

  

效果:

@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中的解决方案对我不起作用,或者我无法使其起作用。

2 个答案:

答案 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逻辑,但您会明白。