我想知道在进行多次mergeMap调用后是否有可能输出可观察到的数组
这是我想找回一个例子
this.kbSvc.create(kb).pipe(
map(dbKb => kb = dbKb),
mergeMap(() => this.goSvc.create(kb.id, "Build Market Share")),
mergeMap(go => this.marketSvc.create(kb.id, (<GrowthOpportunity>go).id, "Market Segment - TBD")),
mergeMap(ms => this.companySvc.create({ id: kb.id, msId: (<MarketSegment>ms).id }, "Company Type - TBD")),
).subscribe(([goSvc Result, marketSvc Result, companySvc Result]) => // //);
上面的所有调用都相互依赖,因为我不能使用forkJoin
。换句话说,我以前的可观察对象必须在调用新对象之前完成。
我试图避免在每个map
之后进行多个mergeMap
调用,并存储每个可观察值的结果值。
谢谢!
答案 0 :(得分:1)
到目前为止,我遇到的运算符无法保持接收或发出的值的状态。像水流一样,他们只是在修改了自己希望的方式之后才让数据流动。
一种解决方案可以通过嵌套管道运算符进行,因此您仍然可以从以前的运算符访问数据。
为了清晰起见,请在函数下定义所有可观察的对象。
goFunc(id) {
return this.goSvc.create(id, "Build Market Share");
}
marketFunc(id, goData) {
return this.marketSvc.create(id, (<GrowthOpportunity>goData).id, "Market Segment - TBD");
}
companyFunc(id, msData) {
return this.companySvc.create({ id: id, msId: (<MarketSegment>msData).id }, "Company Type - TBD");
}
这是嵌套管道的功能,
someFunc() {
this.kbSvc.create(kb).pipe(
mergeMap(kb => this.goFunc(kb).pipe(
mergeMap(goData => this.marketFunc(kb,goData).pipe(
mergeMap(msData => this.companyFunc(kb,msData).pipe(
map((companyData) => [goData,msData,companyData])
)),
))
))
).subscribe(data => {
//data will have [goData,msData,companyData]
console.log(data);
});
}
这应该给出预期的输出。
答案 1 :(得分:0)
其中一种选择是像这样使用combineLatest
-
this.kbSvc
.create(kb)
.pipe(
map(dbKb => kb = dbKb),
mergeMap(() => this.goSvc.create(kb.id, "Build Market Share")),
mergeMap(go => {
return combinedLatest(of(go), this.marketSvc.create(kb.id, (<GrowthOpportunity>go).id, "Market Segment - TBD"));
}),
mergeMap(([goSvcResult, marketSvcResult]) => {
return combinedLatest(of([goSvcResult, marketSvcResult]), this.companySvc.create({ id: kb.id, msId: (<MarketSegment>marketSvcResult).id }, "Company Type - TBD"));
})
).subscribe(([[goSvc Result, marketSvc Result], companySvc Result]) => // //);
注意订阅回调输入。尽管这并不是您所期望的,但还是差不多。