gpt4 book ai didi

Angular 4 : Using HttpClient's interceptor to setup a spinner

转载 作者:太空狗 更新时间:2023-10-29 17:49:47 25 4
gpt4 key购买 nike

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

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

最佳答案

发生这种情况是因为 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;
}

关于 Angular 4 : Using HttpClient's interceptor to setup a spinner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46520889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com