在我的角色服务中,我有两种工作方法:
getAObjects(): Observable<A[]>
convert(object: A): Observable<B>
如果给出了A型对象,它们会执行一些异步请求并获取一组A类型对象或一个B类型对象。
现在我想实现第三种方法:
getBObjects(): Observable<B[]>
这应该异步获取所有A类型的对象,然后将它们转换为B类型的对象。如果我按下获取按钮,就会发生这种情况,所以我想订阅这个新方法,所有请求都应该从那里开始。
到目前为止,我已尝试过以下内容:
getBObjects(): Observable<B[]> {
const a: Observable<A[]> = getAObjects();
const b: Observable<Observable<B>[]> = a.map(aList => aList.map(aItem => convert(aItem)));
const c: Observable<Observable<B>> = b.flatMap(bItem => bItem);
const d: Observable<B> = c.flatMap(cItem => cItem);
}
我想使用像flatMap这样的东西来摆脱Observable的Observable但是要保留数组而不是摆脱数组。这是可能的还是有更好的方法来实现这种转换?
答案 0 :(得分:0)
使用switchMap
。
getBObjects(): Observable<B[]> {
return this.getAObjects().switchMap(as => this.convertAll(as));
}
我认为你可以这样做:
convertAll(as: A[]): Observable<B[]> {
return Observable.combineLatest(as.map(a => this.convert(a)));
}
详情请见:
https://www.learnrxjs.io/operators/transformation/switchmap.html https://www.learnrxjs.io/operators/combination/combinelatest.html