将角度

时间:2018-02-09 15:53:46

标签: angular rxjs observable

在我的角色服务中,我有两种工作方法:

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但是要保留数组而不是摆脱数组。这是可能的还是有更好的方法来实现这种转换?

1 个答案:

答案 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