从HttpInterceptor中的catchError返回可观察到的捕获错误会导致错误循环

时间:2018-08-21 12:27:11

标签: angular rxjs rxjs6

我有一个简单的拦截器,可以处理请求并使用RXJS catchError捕获任何HTTP错误。在catchError中收到的第二个参数是捕获的可观察值。在某些情况下,我想返回此错误,并使其传播到订阅函数中的错误处理程序。问题在于,返回捕获到的错误会导致无限循环(如示例中的https://stackblitz.com/edit/angular-u4gakr所示)

在拦截器中,当接收到HTTP错误(例如404)时,catchError陷入循环的拦截函数:

return next.handle(request)
  .pipe(
    catchError((error, caught$) => {
      console.log('Returning caught observable'); 
      return caught$;
    })
  );

我可能误解了有关拦截器或RxJS catchError的某些信息。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以将返回值更改为此,订阅将处理错误。

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> {
    const requestCopy = request.clone();
    return next.handle(request).pipe(catchError(error => {
      if (error.status === 404) {
        return throwError(error)
      } else {
        return of()
      }
    }))
  }

https://stackblitz.com/edit/angular-zz3glp

答案 1 :(得分:0)

原来,我需要使用return throwError(error)来返回捕获的可观察值,或者of(error)都无法将其正确地返回给订阅函数错误处理程序。

最后的代码是:

return next.handle(request)
  .pipe(
    catchError((error) => {
      console.log('Returning caught observable'); 
      return throwError(error);
    })
  );