首页 > 解决方案 > RxJS从多个mergeMap中输出一个Subscription数组

问题描述

我想知道在进行多次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。换句话说,我之前的 observable 必须在调用新的 observable 之前完成。

我试图避免多次map调用 avfermergeMap并存储每个可观察到的结果值。

谢谢!

标签: rxjsobservable

解决方案


到目前为止,我遇到的运算符不会保持接收或发出的值的状态。就像水流一样,他们只是在修改他们希望的方式后让数据流动。

一种解决方案是通过嵌套管道运算符,因此您仍然可以访问以前运算符的数据。

为了清楚起见,让我们在函数下定义所有可观察的。

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);
 });

}

这应该给出预期的输出。


推荐阅读