如何合并多个 Observable 响应

How to merge multiple Observable responses

我正在尝试将来自 Observables 的多个响应合并到一个流中。我正在获取 companies,每个公司都有多个 inspections(存储为 ID)。对于每个 inspection 我必须获取相应的数据。

这是我的代码目前的样子。请查看当前结果的注释部分。

// Get companies
getCompanies().pipe(
   switchMap(companies => companies.map(
     company => {
       return company['inspections'].map(inspection => {
         // Get inspections by each company
         return this.getInspectionById(inspection['id']);
       })
     }
   ))
).subscribe(result => {
   /* 
     console.log(result) returns the following (company1 has two inspections, company2 has three 
     inspections):

     (2) [Observable, Observable]
       0: Observable
       1: Observable

     (3) [Observable, Observable, Observable]
       0: Observable
       1: Observable
       2: Observable
   */
});

如您所见,我的订阅目前 returns 只有 Observables。我想我只是缺少合并数据流的部分,我尝试了不同的运算符,如 mergeMap、combineLatest、forkJoin 等,但没有找到合适的。

我想要的输出是这样的(与上面完全相同,但是是真实数据而不是可观察数据):

company1:
   company_data: ...
   inspections: [a, b]

company2:
   company_data: ...
   inspections: [a, b, c]

有人知道要使用哪个运算符以及如何使用吗? 提前致谢!

如果我理解你的问题,我认为你对你的方法感到困惑。据我了解,您的可观察对象中有可观察对象。您订阅您的包装器可观察对象并正确获取内部可观察对象。现在你需要这些的价值。为此,这可能会有所帮助:.

您可能正在为这种情况寻找 forkJoin 运算符,如下所示

getCompanies().pipe(
  switchMap(companies => forkJoin(
     companies.map(company => forkJoin(
       company['inspections'].map(inspection =>
         this.getInspectionById(inspection['id'])
       )
     ).pipe(
         map(inspections => ({...company, inspections }))
       )
     )
   ))
)

forkJoin 会将可观察数组和 return 组合成一个单独的 Observable