我有两个可以观察到的: obs1和obs2
Observable<T1[]> (从this.service1.getT1Arr()函数检索)Observable<T2> (从this.service2.getT2(t1: T1)函数检索)我想创建一个具有以下类型的obs3:
Observable<{t1: T1, t2: T2}[]>我当前的问题是,用于检索obs2的函数以一个类型为T1的对象作为参数,因此我需要遵循以下步骤:
目前,我有以下代码:
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}[]>因此,我的问题是:如何在整个过程中保持数组类型而不丢失它以换取可观察的数组类型?
我已经考虑过将诸如concat()、merge()等运算符以及转换运算符switchMap()组合在一起,但问题是,我没有两个平行流,而是从另一个流创建的一个流。
任何帮助都非常感谢!
发布于 2017-06-09 18:18:12
问题是,flatMap的设计是为了平缓一个层次的嵌套。实际上有两个,因为要从选择器函数返回一个Array of Observables。你需要一层额外的扁平:
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();
});发布于 2017-06-12 19:04:35
您需要使用flatMap将列表项流转换为单个项流,然后对每个项t1执行另一个fltaMap调用以获取t2。然后用地图把它们组合起来。看看这个对你有用吗?
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。
https://stackoverflow.com/questions/44461271
复制相似问题