2016-09-16 114 views
2

我將一個流存儲爲一個變量,然後訂閱它3次。多個Api請求

正如我最初想象的那樣,它會執行一個動作,然後在最後得到數據,然後觸發它,每個人都會得到它的一個更新。這是錯誤的,因爲它爲每個用戶執行一個操作,在這種情況下意味着很多API調用。如果我創建了一個主題,然後訂閱它的觀察員,並讓其他人訂閱這個主題然後它的作品。 不幸的是,我是RP新手,你能向我解釋這裏發生了什麼?

this.listStream = Observable 
      .interval(this.refreshInterval) 
      .do(() => console.log('call the api 3 times')) 
      .map(i => fruitApiStream) 
      .startWith(fruitApiStream) 
      .flatMap<FruitDto[]>(s => s) 
      .map<Fruit[]>(
      s => s.map(s => { 
       return new Fruit(s.fruitId, s.name); 
      })); 

回答

0

這裏遇到的問題是典型的問題。這種行爲是由於rxjs流默認爲「冷」的事實。這意味着每個用戶都會重新啓動製作人,因此您會觀察到重複。主題是「熱」,因此,你沒有觀察到重複。

你應該深入瞭解流溫度隱喻,因爲你使用流越多,你將不得不處理這些問題。

簡單的解決方法是使用share操作:

this.listStream = Observable 
      .interval(this.refreshInterval) 
      .do(() => console.log('call the api 3 times')) 
      .map(i => fruitApiStream) 
      .startWith(fruitApiStream) 
      .flatMap<FruitDto[]>(s => s) 
      .map<Fruit[]>(
      s => s.map(s => { 
       return new Fruit(s.fruitId, s.name); 
      })) 
      .share(); 

對於類似的問題(和答案),看看這裏:

對於更好地瞭解熱與冷,看看這裏:

有關明細科目,以及它們的語義,你可以看看這裏:

+0

謝謝您的回答! – user1693057