Как объединить Array Observavble массива только в один Observable массива с RXJS? - PullRequest
0 голосов
/ 05 ноября 2019

Я хочу выполнить x запросов в паралеле и объединить массив. Наблюдаемый массив только в одном Наблюдаемом массиве с 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}]

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Это демонстрация того, как вы можете достичь желаемых результатов. Вы можете использовать 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<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
  })
0 голосов
/ 05 ноября 2019

Мой результат - вкладка уникального элемента вкладки, но если у вас есть несколько вкладок

[
  [
    [{a:1}, {a:2}, {a:3}],
    [{a:4}, {a:5}]
  ],
  [
    [{a:6}, {a:7}, {a:8}],
    [{a:9}, {a:10}]
  ]
]

, вы можете использовать switchMap.

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

    return forkJoin(ox).pipe(switchMap(allGenericMetrics => {
                              let genericMetrics: GenericMetric[] = [];
                              allGenericMetrics.forEach(metrics => {
                                genericMetrics = genericMetrics.concat(metrics);
                              });
                              return of(genericMetrics);
                             })
                        );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...