转换 Observable<Observable<{t1: T1, t2: T2}>>到 Observable<{t1: T1, t2: T2}[]> [英] Convert Observable&lt;Observable&lt;{t1: T1, t2: T2}&gt;&gt; to Observable&lt;{t1: T1, t2: T2}[]&gt;

查看:73
本文介绍了转换 Observable<Observable<{t1: T1, t2: T2}>>到 Observable<{t1: T1, t2: T2}[]>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个 Observable:obs1 和 obs2

I have two Observable: obs1 and obs2

  • obs1Observable 类型(从this.service1.getT1Arr() 函数)
  • obs2 属于 Observable 类型(从 this.service2.getT2(t1: T1) 函数中检索)
  • obs1 is of type Observable<T1[]> (retrieved from a this.service1.getT1Arr() function)
  • obs2 is of type Observable<T2> (retrieved from a this.service2.getT2(t1: T1) function)

我想用以下类型创建一个 obs3:

I want to create an obs3 with the type:

Observable<{t1: T1, t2: T2}[]>

我当前的问题是我用来检索 obs2 的函数将 T1 类型的对象作为参数,因此我需要执行以下步骤:

My current problem is that the function I am using to retrieve obs2 takes as argument an object of type T1, so I need to follow these steps:

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

目前我有以下代码:

obs3 = this.service1.getT1Arr().flatMap((t1Arr: T1[]) => {
    return t1Arr.map((t1) => {
        return this.service2.getT2(t1).map((t2: T2) => {
            return {
                t1: t1
                t2: t2
            }
        }
    }
}

但是我得到了错误

Observable<Observable<{t1: T1, t2: T2}>> is not assignable to 
Observable<{t1: T1, t2: T2}[]>

所以我的问题是:我怎样才能在整个过程中保持我的数组类型,而不是在交换 Observable 时丢失它?

So my question is: How can I keep my array type throughout the process and not lose it in exchange of an Observable?

我已经研究过诸如 concat()merge() 和转换操作符 switchMap() 之类的组合运算符,但问题是我有的是我没有两个并行流,而是从另一个流创建的一个流.

I already looked at combining operators such as concat(), merge() and also the transforming operator switchMap() but the problem I have is that I don't have two parallels stream but one stream that is created from another stream.

非常感谢任何帮助!

推荐答案

问题在于 flatMap 旨在扁平化一层嵌套.你实际上有两个,因为你从选择器函数返回一个 ObservablesArray.您需要额外的扁平化层:

The problem is that flatMap is designed to flatten one level of nesting. You actually have two because you are returning an Array of Observables from the selector function. You need an extra layer of flattening:

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();
});

这篇关于转换 Observable<Observable<{t1: T1, t2: T2}>>到 Observable<{t1: T1, t2: T2}[]>的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆