将'on subscribe'回调附加到observable

时间:2017-08-16 09:15:54

标签: angular rxjs rxjs5

我的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--);
    }

我也可以将计数逻辑移动到其余服务中,但这没有意义,因为我只想计算来自这个组件的请求。

1 个答案:

答案 0 :(得分:2)

在一些Rx变体中,你需要的东西(也许在RxJS 4中,我现在还不确定)但它在RxJS 5中不能作为运算符使用。

最简单的方法是使用Observable.defer创建源Observable:

Observable.defer(() => {
    this.nRunningRequests++
    return this.restService.fetchData(type)
  })
  .finally(() => this.nRunningRequests--);