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())
请注意,你可能正在造成内存泄漏。
