【问题标题】:RXJS catchError does not catch network failure errorsRXJS catchError 不捕获网络故障错误
【发布时间】:2020-08-09 15:52:41
【问题描述】:

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

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);
        }));
}

【问题讨论】:

  • 如果你也可以显示你的拦截器会很有用
  • @PoulKruijt 我已经添加了拦截器代码

标签: angular rxjs angular-httpclient


【解决方案1】:

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

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

catchError 捕获 Observable 流上的任何错误。如果错误到达您的拦截器,它会被捕获并使用of 在 Observable 流上发出一个新值。

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

【讨论】:

  • 感谢您的回答。但是,问题是我的服务方法和拦截器都捕获了所有其他错误,除了网络故障。在网络故障的情况下,catchError 甚至不会被调用。
猜你喜欢
  • 1970-01-01
  • 2018-02-14
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多