只是为了这个问题,我不打算创建一个加载器,只讨论如何在拦截器中实现一个现有的加载器。每次调用时,都会调用该intercept()
函数。这意味着,在intercept()
函数的开头,您应该使用注入的LoaderService
whos 显示加载程序,该任务将根据是否已进行调用以及何时完成来显示和隐藏加载程序。
constructor(private loaderService: LoaderService) {
}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.loaderService.show();
const authReq = req.clone({
headers: req.headers.set('Authorization', 'token')
});
return next.handle(authReq);
}
然后,您必须确保在调用完成后加载程序是隐藏的。您可以通过操作员执行此do
操作。
return next.handle(authReq)
.do(
(response) => {
if (response instanceof HttpResponse) {
this.loaderService.hide();
}
},
(error) => {
this.loaderService.hide();
});
确保导入do
运算符:import "rxjs/add/operator/do";
为什么一定要检查if (event instanceof HttpResponse)
?这是因为HttpInterceptor
拦截 ALL HttpEvent
。这包括HttpSentEvent
,HttpProgressEvent
等,但您不想在接收到这些类型的事件时隐藏加载程序。只有当您真正收到回复时。当然,如果您收到错误,您将隐藏加载程序。您还可以将在收到响应时可能希望发生的任何其他过程放在do
块中。例如,将 Auth 令牌存储在某处。
关于如何创建自己的加载器,我找到了一篇文章,介绍了创建和实现加载器的步骤。您可以将其用作创建加载程序的指南。您可以忽略有关使用自定义实现它的部分,HttpService
因为您不需要它,因为您使用的是新的 Angular HttpClient
。