Angular4:使用HttpClient的拦截器来设置微调器

时间:2017-10-02 07:09:04

标签: angular

这里是我用来直接通过拦截器处理旋转器的拦截器

@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()更改了代码,现在它正常工作。我只是不确定为什么

1 个答案:

答案 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;
}