Jus*_*sky 8 httpclient angular-http-interceptors angular
在我的角度应用程序中,我看到chrome(取消)api调用太快了.我还有一个HttpInterceptor,如果请求没有完成,它会在500ms后触发每个HttpClient请求的加载指示符.但是,对于获取(取消)的请求,似乎没有任何新事件随后隐藏我的加载指示器.
有没有办法在HttpInterceptor中检测"已取消"的请求,以便我可以再次隐藏我的加载指示器?
export class GlobalHttpInterceptor implements HttpInterceptor {
constructor(
private sessionService: SessionService,
private loadingService: LoadingService
) { }
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
setTimeout(() => {
if (showLoading) {
this.loadingService.show();
}
}, 500);
let showLoading = true;
if (this.sessionService.headers.length > 0) {
for (const x of this.sessionService.headers) {
req = req.clone({
headers: req.headers.set(x.key, x.value)
});
}
}
return next.handle(req)
.do(
(response) => {
if (response instanceof HttpResponse) {
showLoading = false;
this.loadingService.hide();
}
},
(error) => {
showLoading = false;
this.loadingService.hide();
});
}
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*avy 15
刚遇到同样的问题.即使取消http请求,finalize运算符似乎也会触发.
public intercept(
request: HttpRequest<any>,
next: HttpHandler
): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
// request starts
return next.handle(request).pipe(
finalize(() => {
// request completes, errors, or is cancelled
})
);
}
Run Code Online (Sandbox Code Playgroud)
Kur*_*ton 12
扩展戴维的回答,这就是我检测中止请求的方式。
正如他所说,finalize 将始终在可观察源完成时运行,在这种情况下,它要么是成功响应,要么是错误响应,要么是中止的请求。
我的方法的关键是跟踪您目前收到的信息。
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let lastResponse: HttpEvent<any>;
let error: HttpErrorResponse;
return next.handle(request)
.pipe(
tap((response: HttpEvent<any>) => {
lastResponse = response;
if (response.type === HttpEventType.Response) {
console.log('success response', response);
}
}),
catchError((err: any) => {
error = err;
console.log('error response', err);
// TODO: error handling if required
return throwError(err);
}),
finalize(() => {
if (lastResponse.type === HttpEventType.Sent && !error) {
// last response type was 0, and we haven't received an error
console.log('aborted request');
}
})
);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1948 次 |
最近记录: |