2017-02-03 104 views
0

我有2個觀測,這兩個HTTP調用:Rxjs結合2個觀測,角2

itemList$:Observable<any[]>; 
newItem$:Observable<any[]>; 

ngOnInit(){ 
    itemList$ = this.http.getList(...some url...) // returns array of many items 
} 

createNewItem(){ 
    newItem$ = this.http.createNewItem(...some url...) //returns array of one item 
} 

我想稱之爲「createNewItem()」函數從其他地方,我想結果被合併用當前的itemList $ observable結果來形成一個項目數組。

在HTML我有一個異步管這就是聽itemList中$:

<div *ngFor="let item of itemList$ | async">{{item.name}}</div> 

我怎麼能合併的newitem $到itemList中$,並有異步管顯示合併的結果嗎?

回答

2

您可以使用Observable.merge(我有RxJS版本5.0.1)

Observable.merge(newItem$, itemList$) 
      .subscribe(response => { 
       // Perform your action 
      }); 

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/merge.md

+0

如果我使用.subscribe操作符,那麼我不能使用異步管道(它自動處理退訂)。 – Nik

+0

然後不要使用異步管道,而是在OnDestroy中手動取消訂閱,或者使用帶便利註釋的TakeUntilDestroy-plugin來自動取消訂閱所有內容。 – Phil

0

您可以使用Subject而不是Observable s。只要你創建一個新的項目,交給主題併發布它。

itemList$:AsyncSubjct<any>; 

createNewItem(){ 
    this.http.createNewItem(...some url...).subscribe(data => { 
    this.itemList$.next(data); 
} 
+0

這似乎是最常見的方法,因爲我找到了。我認爲可能有一個運營商將兩個Observables結合起來,而不需要主題。 – Nik

+0

只要你不訂閱,不應該muzurBurcu的建議爲你工作?我個人喜歡這些主題,因爲他們從Observables繼承而來,並且可以透明地使用而無需任何開銷。 – Matt