这里是我用来直接通过拦截器处理旋转器的拦截器
@Injectable()
export class ApiInterceptor implements HttpInterceptor {
constructor(private _globalSpinnerService: GlobalSpinnerService) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const spinnerParam: string = req.params.get("spinner")
let handleObs: Observable<HttpEvent<any>> = next.handle(req)
if(spinnerParam) {
this._globalSpinnerService.spinner = true
handleObs.toPromise().then(() => {
this._globalSpinnerService.spinner = false
})
}
return handleObs
}
}
它按预期工作。但是,我现在看到所有涉及微调器的请求都被发送了两次。所以我想我删除微调器的方法并不是最好的。一旦手柄结束,我如何告诉我的拦截器移除我的微调器?
修改
我通过将handleObs.toPromise().then
替换为handleObs.do()
更改了代码,现在它正常工作。我只是不确定为什么
答案 0 :(得分:5)
这是因为handleObs
observable很冷,toPromise
创建订阅,然后httpClient(...).subscribe
创建另一个订阅。这导致了几个请求。是的,应该使用handleObs.do()
,它不会导致订阅,只会产生副作用。
通常需要为微调器提供请求计数器,因为它应该正确处理并发请求:
function spinnerCallback() {
if (globalSpinnerService.requestCount > 0)
globalSpinnerService.requestCount--;
}
if(spinnerParam) {
globalSpinnerService.requestCount++;
handleObs.do(spinnerCallback, spinnerCallback);
}
globalSpinnerService.spinner
实际上是一个吸气者:
get spinner() {
this.requestCount > 0;
}