Rxjs结合2个观测,角2

Rxjs结合2个观测,角2

问题描述:

我有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中$,并有异步管显示合并的结果吗?

您可以使用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

您可以使用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