结合Observable和Promise

时间:2017-03-20 13:43:27

标签: rx-java rxjs system.reactive reactive-programming

我有一个服务MyService,它有一个方法getList(),它返回一个Items数组的Observable,类似于

getList(): Observable<Item[]>

检索到列表后,每个项目都需要经过MyServicefillItem(Item)的第二种方法。此方法向某些后端发出请求,返回Promise,如:

fillItem(item: Item) {
   BackEnd.retrieveDetails(item.id)
          .then(data => item.data = data);
}

我需要的是结合上面两种方法,以便MyService能够返回一个Observable,一旦所有项目都填满了他们的数据,就会发出一个项目列表(即一旦所有Promise都被解析了)。

到目前为止,我所尝试的是这些内容

fillAll(items: Item[]) {
   const promises = [];
   for (let i = 0; i < items.length; i++) {
      const item = items[i];
      promises.push(this.fillItem(item));
   }
   const subject = new Subject<Item[]>();
   Promise.all(promises).then(res => {
                subject.next(items);
            },
            err => {
                subject.error(err);
            });
   return subject.asObservable();
}

getListWithFilledItems() {
   return this.getList()
              .map(items => this.fillAll(items))
}

不幸的是,如果我这样做,方法getListWithFilledItems()会返回Observable<Observable<Item[]>>而不是我希望的Observable<Item[]>

有关如何更改代码以便方法getListWithFilledItems()返回Observable<Item[]>的任何建议,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

我认为.map(items => this.fillAll(items))代替mergeMap()而不是.mergeMap(items => this.fillAll(items))

fillAll()

这将订阅从complete()返回的Observable,并在它准备就绪时重新发送它的值。

顺便说一下,请注意,您没有在内部subject上调用<td> <a>Pitstop</a> <a class="arrow"></a> </td> ,因此Observable链未正确处理(但在您的用例中可能不重要)。< / p>