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

Returning caught error observable from catchError in HttpInterceptor causes error loop

我有一个简单的拦截器,它可以处理请求并使用 RXJS catchError 捕获任何 http 错误。 catchError 接收到的第二个参数是捕获的可观察对象。在某些情况下,我想 return 这个错误并让它传播到订阅函数中的错误处理程序。问题是 return 捕获到的错误会导致无限循环(如示例所示: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 有一些误解。有什么建议吗?

您可以将 return 更改为这个,订阅将处理错误。

  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

原来我需要使用 return throwError(error) 作为 returning 捕获的可观察对象,或者(错误)都未能 return 正确地使用订阅函数错误处理程序。

那么最后的代码是:

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