【问题标题】:Converting Observable<A[]> to Observable<B[]> in angular以角度将 Observable<A[]> 转换为 Observable<B[]>
【发布时间】:2018-02-09 15:53:46
【问题描述】:

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

getAObjects(): Observable<A[]>

convert(object: A): Observable<B>

它们执行一些异步请求,并获取一组 A 类型对象或 B 类型对象(如果给定 A 类型对象)。

现在我要实现第三种方法:

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

【问题讨论】:

    标签: angular rxjs observable


    【解决方案1】:

    使用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

    【讨论】:

    • combineLatest 返回一元函数(src: Observable):Observable] switchMap 无法转换类型。
    • 我试过switchMap((as: A[]) =&gt; combineLatest(as.map(a =&gt; this.convert(a))(this.getAObjects())这返回了一个一元函数(src: Observable&lt;A[]&gt;): Observable&lt;[{}, Observable&lt;B&gt;]&gt;
    • 下面的怎么样:getBObjects(): Observable&lt;B[]&gt; { return this.getAObjects().pipe( switchMap(as: A[] =&gt; as.map(a =&gt; this.convert(a))), combineAll() ); }
    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 2018-12-27
    • 2021-05-24
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    相关资源
    最近更新 更多