Объедините наблюдаемое с результатами его трубы в одну наблюдаемую - PullRequest
0 голосов
/ 29 апреля 2018

Я запрашиваю вложенный RESTful API с помощью модуля Angular HttpClient. Получение полного объекта требует извлечения данных из нескольких конечных точек, ссылки на которые хранятся в ответе на первый запрос.

Я использую forkJoin для параллельной отправки 2, 3, 4 и т. Д. Запросов. Это прекрасно работает, однако я «теряю» результат первого запроса. Мое текущее решение состоит в том, чтобы включить его в forkJoin, превратив результат запроса в наблюдаемый через оператор of()

this.http.post(url, geoRequest, httpOptions).pipe(
  concatMap(resp => {
    return forkJoin(
      of(resp),
      this.http.get(resp[0]["_links"].endpointA.href, httpOptions),
      this.http.get(resp[0]["_links"].endpointB.href, httpOptions)
    );
  })
);

В результате получается массив с тремя элементами, каждый из которых содержит результат каждого запроса. Отлично. Тем не менее, «воссоздание» первоначальной наблюдаемой (через of(resp)) выглядит немного странно, и мне интересно, есть ли более элегантное решение для этого.

1 Ответ

0 голосов
/ 29 апреля 2018

Я думаю, что вы делаете прекрасно, но я понимаю, что это выглядит странно.

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

return forkJoin(
    this.http.get(...),
    this.http.get(...),
  )
  .pipe(
    map(results => [resp, ...results]),
  )

Оператор forkJoin также имеет так называемую функцию «выбора результатов», что означает, что вы можете использовать обратный вызов map в качестве последнего параметра после перечисления всех исходных наблюдаемых. Однако это было удалено в RxJS 6, так что вы больше не должны его использовать.

https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#howto-result-selector-migration

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...