将 'on subscribe' 回调附加到 observable
Attach 'on subscribe' callback to observable
我的 angular 4 应用程序有一个正在注入各种组件和 returns 可观察对象的休息服务。在一个特定的组件中,我想计算未决请求的数量。我目前通过在发出请求时递增计数器并在请求完成(成功与否)时递减计数器来执行此操作。有点像这样:
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--);
}
我也可以将计数逻辑移到其余服务中,但这没有意义,因为我只想计算来自这一个组件的请求。
在某些 Rx 变体中有您需要的东西(也许在 RxJS 4 中也有,我现在不确定)但它在 RxJS 5 中不能作为运算符使用。
最简单的方法是使用 Observable.defer
创建源 Observable:
Observable.defer(() => {
this.nRunningRequests++
return this.restService.fetchData(type)
})
.finally(() => this.nRunningRequests--);
我的 angular 4 应用程序有一个正在注入各种组件和 returns 可观察对象的休息服务。在一个特定的组件中,我想计算未决请求的数量。我目前通过在发出请求时递增计数器并在请求完成(成功与否)时递减计数器来执行此操作。有点像这样:
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--);
}
我也可以将计数逻辑移到其余服务中,但这没有意义,因为我只想计算来自这一个组件的请求。
在某些 Rx 变体中有您需要的东西(也许在 RxJS 4 中也有,我现在不确定)但它在 RxJS 5 中不能作为运算符使用。
最简单的方法是使用 Observable.defer
创建源 Observable:
Observable.defer(() => {
this.nRunningRequests++
return this.restService.fetchData(type)
})
.finally(() => this.nRunningRequests--);