首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Observable<Observable<{t1: T1,t2: T2}>>转换为Observable<{t1: T1,t2: T2}[]> ]

将Observable<Observable<{t1: T1,t2: T2}>>转换为Observable<{t1: T1,t2: T2}[]> ]
EN

Stack Overflow用户
提问于 2017-06-09 15:12:25
回答 2查看 121关注 0票数 1

我有两个可以观察到的: obs1和obs2

  • obs1类型为Observable<T1[]> (从this.service1.getT1Arr()函数检索)
  • obs2类型为Observable<T2> (从this.service2.getT2(t1: T1)函数检索)

我想创建一个具有以下类型的obs3

代码语言:javascript
复制
Observable<{t1: T1, t2: T2}[]>

我当前的问题是,用于检索obs2的函数以一个类型为T1的对象作为参数,因此我需要遵循以下步骤:

  1. 从T1[]数组中检索每个类型为T1的对象
  2. 对于每个对象,检索其相应的对象T2
  3. 构造由这两个对象组成的对象

目前,我有以下代码:

代码语言:javascript
复制
obs3 = this.service1.getT1Arr().flatMap((t1Arr: T1[]) => {
    return t1Arr.map((t1) => {
        return this.service2.getT2(t1).map((t2: T2) => {
            return {
                t1: t1
                t2: t2
            }
        }
    }
}

但我得到了错误

代码语言:javascript
复制
Observable<Observable<{t1: T1, t2: T2}>> is not assignable to 
Observable<{t1: T1, t2: T2}[]>

因此,我的问题是:如何在整个过程中保持数组类型而不丢失它以换取可观察的数组类型?

我已经考虑过将诸如concat()、merge()等运算符以及转换运算符switchMap()组合在一起,但问题是,我没有两个平行流,而是从另一个流创建的一个流。

任何帮助都非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2017-06-09 18:18:12

问题是,flatMap的设计是为了平缓一个层次的嵌套。实际上有两个,因为要从选择器函数返回一个Array of Observables。你需要一层额外的扁平:

代码语言:javascript
复制
const obs3: Observable<{T1, T2}[]> = 
  this.service1.getT1Arr().flatMap((t1Arr: T1[]) => {
    // Lift the t1Array into an Observable<T1>
    return Observable.from(t1Array)
      // Flatten the results of calling service2
      .concatMap(
        // Returns Observable<T2>
        t1 => this.service2.getT2(t1),
        // Use the result selector to map to your desired structure
        (t1, t2) => ({t1, t2})
      )
      // Gather the results back up Observable<{T1, T2}[]>
      .toArray();
});
票数 1
EN

Stack Overflow用户

发布于 2017-06-12 19:04:35

您需要使用flatMap将列表项流转换为单个项流,然后对每个项t1执行另一个fltaMap调用以获取t2。然后用地图把它们组合起来。看看这个对你有用吗?

代码语言:javascript
复制
this.service1.getT1Arr()
    .flatMap(t1Arr: T1[] => Observable.from(t1Arr))
    .flatMap((t1 : T1)=> this.service2.getT2(t1)
         .map((t2:T2)=> {t1: t1, t2: t2})
     );

如果希望在单个数组而不是流中获得结果,可以在上一次.toArray()之后添加flatMap。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44461271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档