首页 > 解决方案 > 如何将数组的 Array Observavble 合并到只有一个数组的 Observable 与 RXJS?

问题描述

我想并行执行x请求并将数组的数组Observavble合并到只有一个数组的Observable与RXJS?

public getMetrics(url: string): Observable<GenericMetric[]> {    
    const ox: Observable<GenericMetric[]>[] = [];
    res.forEach(elem => {
        ox.push(this.http.get<GenericMetric[]>(url));
    });

    return forkJoin(...ox);
}

我尝试:

return forkJoin(...ox); // return array of GenericMetric[] but I want all results in GenericMetric[]

我正在寻找如何将我的数组结果合并为一个数组

return forkJoin(ox).pipe(?????);

编辑:

我尝试:

return forkJoin(...ox).pipe(tap(d => console.log(d) ));

我的结果是:

[
  [{a:1}, {a:2}, {a:3}],
  [{a:4}, {a:5}]
]

但我想要 :

[{a:1}, {a:2}, {a:3}, {a:4}, {a:5}]

标签: arraystypescriptrxjs

解决方案


这是一个关于如何实现预期结果的演示。您可以使用 ES6 的扩展语法将数组展平为数组。

const arr = [
  [{a:1}, {a:2}, {a:3}],
  [{a:4}, {a:5}]
];
const res = [];
arr.map(item => {
  res.push(...item)
})

console.log(res)

forkJoin(ox)将返回一个 observable 类型Observable<GenericMetric[]>[],这意味着它是一个GenericMetric[]. GenericMetric[]您无法将其简化为 GenericMetric ( )数组。

但是,您仍然可以forkJoin(ox)通过使用可管道操作符(例如map

forkJoin(ox)
  .pipe( 
    map(res => {
      const result = [];
      res.map(elem => {
        res.push(...elem)
      });
      return result;
    }),
  ).subscribe(res => {
    console.log(res);
    // do the rest
  })

推荐阅读