RXJS catchError不会捕获网络故障错误



我有一个服务方法,它发出API注销应用程序的post请求。

public logout(): Observable<APIResponse | ResponseError> {
return this.http
.post<APIResponse>(API_ENDPOINT + LOGOUT_URL, '{}', this.httpHeaders)
.pipe(catchError((error) => {
return of(this.handleError(error.error));
}));
}

catchError捕获从服务器抛出的所有其他有效错误。但是,当没有网络连接或服务器关闭时,它就无法工作。有趣的是,所有这些错误都被我的拦截器正确地捕捉到了,它对特定的响应进行了一些定制的处理。

有人能告诉我为什么它在拦截器中有效,但在我的服务中无效吗?我在拦截器中也使用了相同的catchError运算符。

这是受体

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
if (req.url.endsWith('/login')) {
return next.handle(req);
}
const body = JSON.parse(<string>req.body);
const copiedReq = req.clone({ body: body });
return next.handle(copiedReq)
.pipe(tap(evt => { }), catchError((err: any) => {
if (err instanceof HttpErrorResponse) {
const httpError: HttpErrorResponse = err;
// Custom logic ...
}
return of(err);
}));
}

如果您在拦截器中使用相同的catchError,那么您所描述的行为正是我所期望的。在这种情况下,错误会被拦截器吞噬。

.pipe(catchError((error) => {
return of(this.handleError(error.error));
}));

catchError捕获Observable流上的任何错误。如果拦截器中出现错误,则会捕获该错误,并使用of在Observable流上发出一个新值。

我建议在您的拦截器中使用throwError而不是of,因为这样原始错误就会在Observable流上发出,并最终在您的服务中保持不变。

最新更新