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

Sci*_*ion 4 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
    }
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作。但是,我现在看到我所有涉及微调器的请求都发送了两次。所以我想我删除微调器的方法不是最干净的。手柄结束后,如何告诉我的拦截器取下旋转器?

编辑:

我通过更换我改变了代码handleObs.toPromise().then通过handleObs.do()和它现在工作的罚款。我只是不确定为什么

Est*_*ask 5

发生这种情况是因为handleObs可观察的状态很冷,toPromise创建了一个订阅,然后httpClient(...).subscribe创建了另一个订阅。这导致几个请求。是的,handleObs.do()应该改用它,它不会导致订阅,只会带来副作用。

通常,希望有一个微调器的请求计数器,因为它应该正确处理并发请求:

function spinnerCallback() {
  if (globalSpinnerService.requestCount > 0) 
    globalSpinnerService.requestCount--;
}

if(spinnerParam) {
    globalSpinnerService.requestCount++;
    handleObs.do(spinnerCallback, spinnerCallback);
}
Run Code Online (Sandbox Code Playgroud)

globalSpinnerService.spinner实际上是一个getter:

get spinner() {
  this.requestCount > 0;
}
Run Code Online (Sandbox Code Playgroud)