Stream 转换可观察值<;可观察<;{t1:t1,t2:t2}>&燃气轮机;可观察<;{t1:t1,t2:t2}[]>;

Stream 转换可观察值<;可观察<;{t1:t1,t2:t2}>&燃气轮机;可观察<;{t1:t1,t2:t2}[]>;,stream,rxjs,observable,Stream,Rxjs,Observable,我有两个可观察的:obs1和obs2 obs1属于可观察的类型(从 this.service1.getT1Arr()函数) obs2属于可观察类型 (从this.service2.getT2(t1:t1)函数中检索) 我想创建一个具有以下类型的obs3: Observable<{t1: T1, t2: T2}[]> 但是我弄错了 Observable<Observable<{t1: T1, t2: T2}>> is not assignable to

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

  • obs1属于
    可观察的类型(从
    
    this.service1.getT1Arr()
    函数)
  • obs2属于
    可观察类型
    (从
    this.service2.getT2(t1:t1)
    函数中检索)
我想创建一个具有以下类型的obs3

Observable<{t1: T1, t2: T2}[]>
但是我弄错了

Observable<Observable<{t1: T1, t2: T2}>> is not assignable to 
Observable<{t1: T1, t2: T2}[]>
可观察的不可分配给
可观察
所以我的问题是:如何在整个过程中保持我的数组类型,而不丢失它来交换一个可观察的数组

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


非常感谢任何帮助

问题在于
flatMap
设计用于展平一级嵌套。实际上您有两个,因为您正在从选择器函数返回一个
可观测值的
数组。您需要额外一层展平:

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();
});
const obs3:可观测=
this.service1.getT1Arr().flatMap((t1Arr:T1[])=>{
//将阵列提升到可观察的位置
返回可观测值。从(t1Array)
//展平调用service2的结果
.concatMap(
//可观测收益
t1=>this.service2.getT2(t1),
//使用结果选择器映射到所需的结构
(t1,t2)=>({t1,t2})
)
//将结果收集到可观察的数据中
.toArray();
});

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

this.service1.getT1Arr()
    .flatMap(t1Arr: T1[] => Observable.from(t1Arr))
    .flatMap((t1 : T1)=> this.service2.getT2(t1)
         .map((t2:T2)=> {t1: t1, t2: t2})
     );

如果希望在单个数组而不是流中获得结果,可以在最后一个平面图之后添加
.toArray()

是否尝试使签名特定?i、 e.
.flatMap((t1Arr:T1[]):数组=>{…}
谢谢您的快速回复!因此我尝试了它,但不幸的是它不起作用。由于您的回答,该类型现在是正确的,但是当我订阅它时,即使我看到我的t1Arr长度为6,我也什么也得不到。同样奇怪的是,显然我只在concatMap中输入了一次,而我应该在ca中输入6次se(我尝试用flatMap替换concatMap,并按预期输入了6次,但在订阅时仍然没有结果)。您知道它可能来自哪里吗?请确保
getT2()
getT1Arr()
观测值已完成。如果只输入一次
concatMap
,则表示内部观测值未完成。
this.service1.getT1Arr()
    .flatMap(t1Arr: T1[] => Observable.from(t1Arr))
    .flatMap((t1 : T1)=> this.service2.getT2(t1)
         .map((t2:T2)=> {t1: t1, t2: t2})
     );