我的angular 4应用程序有一个休息服务,它被注入各种组件并返回可观察量。在一个特定的组件中,我想要计算待处理的请求。我目前通过在发出请求时递增计数器并在请求完成时递减计数(成功与否)来完成此操作。有点像这样:
export class MyComponent {
nRunningRequests = 0;
constructor(private restService: RestService) {
}
loadData(type: string): Observable<any> {
// this line is wrongly executed too soon, since the request
// is not actually done yet
this.nRunningRequests++;
return this.restService.fetchData(type)
.finally(() => this.nRunningOperations--);
}
loadNames(): Observable<any> {
this.loadData('names');
// oops, didn't subscribe, so no request is actually being done
// but nRunningRequests is now wrong
}
}
我遇到的问题是,如果我实际上没有subscribe()
到observable,则不会触发任何请求,因此计数器不应该递增。有没有办法在订阅时附加回调?有点像:
loadData(type: string): Observable<any> {
return this.restService.fetchData(type)
.initially(() => this.nRunningRequests++)
.finally(() => this.nRunningRequests--);
}
我也可以将计数逻辑移动到其余服务中,但这没有意义,因为我只想计算来自这个组件的请求。
答案 0 :(得分:2)
在一些Rx变体中,你需要的东西(也许在RxJS 4中,我现在还不确定)但它在RxJS 5中不能作为运算符使用。
最简单的方法是使用Observable.defer
创建源Observable:
Observable.defer(() => {
this.nRunningRequests++
return this.restService.fetchData(type)
})
.finally(() => this.nRunningRequests--);