【问题标题】:Rxjs Sharing an observable subscriptionRxjs 共享一个可观察的订阅
【发布时间】:2018-04-29 15:28:31
【问题描述】:

我有一个函数,代码如下:

private foo() {
    let obs: Observable<any> = this._http.get<number>('/foo')

    obs.subscribe(x=> {
        console.log("foo : " + x)
    });

     this.blah(obs)
}

private blah(obs: Observable<any>) {
    obs.subscribe(x => {
       console.log("blah : " + x)
    })
}

这段代码确实同时打印了fooblah,但是它也两次对/foo 进行了http 调用

我希望它只发生一次。我尝试在 blah 函数中用do 替换subscribe,但它不起作用。 这里有什么问题?

【问题讨论】:

    标签: javascript angular typescript rxjs


    【解决方案1】:

    这是正确的行为。您正在创建两个订阅,并且由于 http.get 创建了一个“冷” Observable,它会进行两次 HTTP 调用。

    避免这种情况的最简单方法是与share() 运算符共享源 Observable。

    let obs = this._http.get<number>('/foo').share();
    

    您还可以使用publish() 运算符创建ConnectableObservable 并手动连接到共享源。

    let obs = this._http.get<number>('/foo').publish();
    
    obs.subscribe(x=> {
        console.log("foo : " + x)
    });
    
    this.blah(obs);
    
    obs.connect();
    

    【讨论】:

      猜你喜欢
      • 2018-07-28
      • 2017-04-13
      • 2021-08-02
      • 1970-01-01
      • 2018-06-23
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      相关资源
      最近更新 更多