Tìm kiếm trang web

javascript - Rxjs Chia sẻ một đăng ký observable


Tôi có một hàm với đoạn mã sau:

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)
    })
}

Mã này thực sự đang in cả foo và blah, tuy nhiên nó cũng thực hiện cuộc gọi http của tôi tới /foo hai lần

Tôi chỉ muốn điều đó xảy ra một lần. Tôi đã cố gắng thay subscribe bằng do trong hàm blah nhưng nó không hoạt động. Vấn đề ở đây là gì?

Câu trả lời #1

Đó là hành vi đúng. Bạn đang tạo hai đăng ký và vì http.get tạo ra một Observable "lạnh", nên nó thực hiện hai lời gọi HTTP.

Cách dễ nhất để tránh điều này là chia sẻ Observable nguồn với toán tử share().

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

Bạn cũng có thể tạo một ConnectableObservable với toán tử publish() và kết nối với nguồn được chia sẻ một cách thủ công.

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

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

this.blah(obs);

obs.connect();