将 '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--);