Stream 转换可观察值<;可观察<;{t1:t1,t2:t2}>&燃气轮机;可观察<;{t1:t1,t2:t2}[]>;
我有两个可观察的:obs1和obs2Stream 转换可观察值<;可观察<;{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属于
可观察的类型(从
函数)this.service1.getT1Arr()
- obs2属于
(从可观察类型
函数中检索)this.service2.getT2(t1:t1)
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})
);