网站搜索

javascript - 自定义 HttpInterceptor - 如何返回一个永不解析的 Observable?


我正在参考这篇文章,了解如何通过自定义的 HttpInterceptor 类在我的 Angular 应用中实现全局错误处理。

重要的部分是这个 intercept() 的实现:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return next.handle(request).do((event: HttpEvent<any>) => {}, (err: any) => {
      if (err instanceof HttpErrorResponse) {
        // do error handling here
      }
    });
  }

我无法弄清楚的是,如果我在这里捕获一个错误,如何让 intercept() 函数返回一个永远不会解析的 Observable?

我尝试将 next.handle.do() 改为 next.handle.catch(),这让我可以返回一个 Observable,但我想使用 Observable.never 来返回一个永远不会解析的 Observable,但它期望我返回的类型是 Observable<HttpEvent<any>>,而且它不允许我将 NeverObservable 强制转换为该类型。

有办法获得我想要的功能吗?

答案#1

不要返回 never。返回一个空值。它们会自动完成你想要的,因为 never 会一直保留在内存中,直到页面的 ondestroy 事件。循环中的任何返回 500/503 的内容都会堆积起来。

if (err instanceof HttpErrorResponse) {
   if (err.status === 503 || err.status ===500) {
    // do handling. message or whatever
        return Observable.empty();
   }
}

答案#2

如果我理解得没错,你受到 intercept 的返回类型的限制,无法更改它?如果你可以更改它,就直接这样做:

intercept(...): Observable<HttpEvent<any>> | Observable<never>

如果你做不到这一点,那么我 catchError() 只是返回一个永远不完成的 Observable:

catchError(() => new Observable())

请注意,你可能正在造成内存泄漏。