Angular RXJS-3个平行观察值,然后发出值,并使用此值调用3个串联观察值

Angular RXJS-3个平行观察值,然后发出值,并使用此值调用3个串联观察值,angular,rxjs,Angular,Rxjs,关闭 也许我的问题有点复杂,但我不知道如何实现我想要的 上下文 三个平行的观测值发出值,然后,当我得到所有三个值时,我稍微修改它们,然后我想调用三个串联的观测值。 如下图所示: 现在? 目前,我设法做到了这一点,将我的三个平行可观测对象放入一个zip操作符中,然后订阅它,修改值,完成后,调用另一个,订阅,完成。。三次! this.service.Function(id)//返回zip(Ob1、Ob2、Ob3) .订阅( ([val1,val2,val3])=>{ /*做点什么*/ 该值为0.

关闭

也许我的问题有点复杂,但我不知道如何实现我想要的

上下文
三个平行的观测值发出值,然后,当我得到所有三个值时,我稍微修改它们,然后我想调用三个串联的观测值。 如下图所示:

现在?
目前,我设法做到了这一点,将我的三个平行可观测对象放入一个zip操作符中,然后订阅它,修改值,完成后,调用另一个,订阅,完成。。三次!

this.service.Function(id)//返回zip(Ob1、Ob2、Ob3)
.订阅(
([val1,val2,val3])=>{
/*做点什么*/
该值为0.tmp1=val1;
this.tmp2=val2;
该值为0.tmp3=val3;
},
()=>{},//出错
()=>{//on完成
让newV1,newV2,newV3=[];
[newV1、newV2、newV3]=[
这个.tmp1.map(x=>x.id2),
这个.tmp2.map(x=>x.id2),
this.tmp3.map(x=>x.id2)
];
this.service.Function2(newV1)
.订阅(res=>{
//做点什么
},
() => {},
()=>{//on完成
this.service.Function2(newV2)
.订阅(res=>{
//做点什么
},
() => {},
()=>{//on完成
this.service.Function2(newV3)
.订阅(res=>{
//做点什么
},
() => {},
() => {
//做点什么
});
});
});
}
);
我尝试的
我尝试了一些与switchMapconcat不同的东西,但是concat没有将我的值作为数组返回给我

this.kycService.getDocuments(idNotif).pipe(
开关映射([val1,val2,val3])=>{
该值为0.tmp1=val1;
this.tmp2=val2;
该值为0.tmp3=val3;
让newV1,newV2,newV3=[];
[newV1、newV2、newV3]=[
这个.tmp1.map(x=>x.id2),
这个.tmp2.map(x=>x.id2),
this.tmp3.map(x=>x.id2)
];
返回concat(this.service.Function2(newV1)、this.service.Function2(newV2)、this.service.Function2(newV3))
}))
.订阅([Ob_newV1,Ob_newV2,Ob_newV3])=>{
//做点什么
//[Ob_newV1,Ob_newV2,Ob_newV3]不工作,我需要执行val=>{}
})
);
如果您对使用什么有任何建议,我对RXJS中的所有运算符/函数都有点困惑

先谢谢你

我的解决方案

this.kycService.getDocuments(idNotif).pipe(
开关映射([val1,val2,val3])=>{
该值为0.tmp1=val1;
this.tmp2=val2;
该值为0.tmp3=val3;
让newV1,newV2,newV3=[];
[newV1、newV2、newV3]=[
这个.tmp1.map(x=>x.id2),
这个.tmp2.map(x=>x.id2),
this.tmp3.map(x=>x.id2)
];
返回concat(this.service.Function2(newV1)、this.service.Function2(newV2)、this.service.Function2(newV3))
}))
.订阅((val)=>{
//做点什么
//每次我的函数2完成时都会发出val,因此我设法处理这个问题并重新排列数据
})
);

取决于可观察的类型

对于热观测(主题、存储等),您将使用
combinelateest

对于冷观测(of、HTTP调用、来自承诺等),您将使用
forkJoin

让我们假设它们是冷的

forkJoin(
第一根管子(
映射(结果=>/*第一次可观察到的变换*/),
switchMap(结果=>this.myService.getNextTobServableFromFirst())
),
第二根管子(
映射(结果=>/*第二个可观察对象的变换*/),
switchMap(结果=>this.myService.getNextTobServableFromSecond())
),
第三根管子(
映射(结果=>/*第三个可观察对象的变换*/),
switchMap(结果=>this.myService.getNextTobServableFromThird())
),
).订阅([r1、r2、r3]=>/*所有呼叫完成后要做什么*/);
看起来,根据你的情况,它会

forkJoin(
第一根管子(
映射(result=>result.id2),
switchMap(结果=>this.myService.Function2(结果))
),
第二根管子(
映射(result=>result.id2),
switchMap(结果=>this.myService.Function2(结果))
),
第三根管子(
映射(result=>result.id2),
switchMap(结果=>this.myService.Function2(结果))
),
).订阅([r1,r2,r3]=>/*做点什么*/);

.pipe(toArray())
?您似乎在寻找
forkJoin
,但我不确定这些
这个.service.Function2(…)
函数是什么do@JBNizet它有效,但是。。当我使用
.subscribe((val)=>{
执行此操作时,仅当所有3个(或图像中的4个)时,它才会发出值observable complete..如果没有这个,每次我的observable发出一些东西时它都会发出值..我将不使用toArray并处理响应!谢谢!OP说一旦zip返回observable数组,异步调用就会连续进行。但是我想,
forkJoin
不能处理这种情况。
forkJoin
是合适的当发出并行请求时。他的所有调用都已发出,forkjoin只是在所有请求完成后进行回调。顺便说一句@AmitChigadani,我正在清除这里的
zip
,但仍然丢失了模式
第一个序列为并行,第二个序列为串行不会以与图中所示相同的方式进行操作。我看不到图像(公司代理),因此我依赖于提供的代码。鉴于他提供的代码,您刚才引用的声明是错误的:不是3个并行调用,然后是3个串行调用,而是一个调用,然后是另一个调用