RxJS从多个mergeMap输出订阅的数组

时间:2019-06-14 21:15:09

标签: rxjs observable

我想知道在进行多次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调用,并存储每个可观察值的结果值。

谢谢!

2 个答案:

答案 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]) => // //);

注意订阅回调输入。尽管这并不是您所期望的,但还是差不多。