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

时间:2018-10-26 17:23:25

标签: javascript angular typescript rxjs

我正在跟踪this article,了解如何通过自定义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转换为该类型。

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

2 个答案:

答案 0 :(得分:1)

不要返回永不。返回一个空的。它们会自动完成您想要的操作,因为在页面ondestory事件之前,它们永远不会在内存中徘徊。循环中返回500/503的所有内容都会堆积起来。

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

答案 1 :(得分:0)

如果我对您的理解正确,那么您会受到intercept的返回类型的限制,无法更改?如果可以更改,只需进行以下操作:

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

如果您无法执行此操作,那么我catchError()仅返回一个永远不会完成的Observable:

catchError(() => new Observable())

请注意,您可能正在创建内存泄漏。