我有一个服务MyService
,它有一个方法getList()
,它返回一个Items数组的Observable,类似于
getList(): Observable<Item[]>
检索到列表后,每个项目都需要经过MyService
,fillItem(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[]>
的任何建议,我们将不胜感激。
答案 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>