Rx java 可观察与承诺相结合
我有一个服务,MyService,它有一个方法getList,它返回一个项目数组的可观察值,比如Rx java 可观察与承诺相结合,rx-java,rxjs,system.reactive,reactive-programming,Rx Java,Rxjs,System.reactive,Reactive Programming,我有一个服务,MyService,它有一个方法getList,它返回一个项目数组的可观察值,比如 getList(): Observable<Item[]> 我需要的是将上述两种方法结合起来,以便MyService能够返回一个Observable,一旦所有项目都被数据填充,即一旦所有承诺都被解决,它就会发出项目列表 到目前为止,我所做的尝试都是这样的 fillAll(items: Item[]) { const promises = []; for (let i = 0
getList(): Observable<Item[]>
我需要的是将上述两种方法结合起来,以便MyService能够返回一个Observable,一旦所有项目都被数据填充,即一旦所有承诺都被解决,它就会发出项目列表
到目前为止,我所做的尝试都是这样的
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方法将返回一个可观察的,而不是我所希望的可观察的
任何关于如何更改代码以使getListWithFilledItems方法返回可观察值的建议都将不胜感激。我认为,您可以使用just mergeMap代替.mapitems=>this.FillItems:
这将订阅从fillAll返回的Observable,并在准备就绪时重新提交其值
顺便说一句,请注意,您没有对内部主题调用complete,因此无法正确处理可观察链,但它在您的用例中可能并不重要。我忘了感谢快速响应,这实际上使我的代码正常工作。我仍在努力理解为什么mergeMap可以工作而switchMap不能,但我认识到Rx和Observables是我多年来在专业领域遇到的最具智力挑战性和刺激性的东西。
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))
}
.mergeMap(items => this.fillAll(items))