【问题标题】:Angular4: Using HttpClient's interceptor to setup a spinnerAngular4:使用 HttpClient 的拦截器来设置微调器
【发布时间】:2017-11-15 05:34:11
【问题描述】:

这里是我写的拦截器,直接通过拦截器处理微调器

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

【问题讨论】:

    标签: angular


    【解决方案1】:

    发生这种情况是因为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实际上是一个getter:

    get spinner() {
      this.requestCount > 0;
    }
    

    【讨论】:

    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 2020-04-07
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多