Как объединить два одинаковых http-запроса, возвращающих Rx Observables? - PullRequest
0 голосов
/ 23 июня 2018

Как объединить 2 отдельных http-запроса в один ответ (присоединиться к ним)?

Observable.merge(
  this.http.get(url1), // [{"city":"New York"},{"city":"Chicago"}]
  this.http.get(url2)  // [{"city":"Washington"},{"city":"Detroit"}]
).subscribe(res => console.log(res.json()))

Я получаю обратно два массива:

[{"city":"New York"},{"city":"Chicago"}],
[{"city":"Washington"},{"city":"Detroit"}]

Что мне нужно, так этоодин массив с объединенными результатами:

[{"city":"New York"},{"city":"Chicago"},{"city":"Washington"},{"city":"Detroit"}]

Т.е. одна наблюдаемая из 4 объектов, а не 2 наблюдаемые из 2 объектов.

Ответы [ 2 ]

0 голосов
/ 23 июня 2018
Observable.merge(
  this.http.get(url1).pipe(mergeMap(a => a)), 
  this.http.get(url2.pipe(mergeMap(a => a))  
).subscribe(res => console.log(res.json()))
0 голосов
/ 23 июня 2018

Я полагаю, вы хотите forkJoin (который становится Zip оператором), который возвращает наблюдаемую последовательность с массивом, собирающим последние элементы всех входных последовательностей:

combine(): {
  return Observable.forkJoin(
    this.http.get(url1).map(res => res.json()),
    this.http.get(url2).map(res => res.json())
  )
}

...

  this.combine().subscribe(result => 
    console.log(result[0], result[1])
  )

Также вас может заинтересовать оператор combainLatest .


UPD Чтобы получить комбинированный результат, вы можете использовать map и оператор распространения:

combine(): {
  return Observable.forkJoin(
    this.http.get(url1).map(res => res.json()),
    this.http.get(url2).map(res => res.json())
  )
  .map((data: any[]) => ([...data[0], ...data[1]])
}

...

  this.combine().subscribe(result => 
    console.log(result)
  )
...