Построить каналы с несколькими асинхронными HTTP-запросами. - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно сделать первый HTTP-запрос и получить из массива ответа объекта. Затем мне нужно сделать HTTP-запрос для каждого объекта в массиве (вероятно, в цикле), чтобы получить дополнительную информацию. Все это внутри Angular. Я пробую с трубами, но у меня есть некоторые трудности.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

По сути, вы бы использовали mergeMap / flatMap для вложенного вызова API, извлекая значение из внутреннего Observable и передавая его обратно в родительский поток.

Как в примере ниже, ответ, если у вас былочтобы сделать вложенный вызов для извлечения пользователя, а затем его предпочтений, вы должны использовать flatmap, как показано ниже.

ngOnInit() {
    this.userService.getUser().pipe(
        tap(u => this.user = u),
        flatMap(u => this.userService.getPreferences(u.username))
      ).subscribe(p => this.preferences = p);
}

Как сделать вложенные вызовы Observable в Angular2

0 голосов
/ 28 мая 2019

Ваше объяснение довольно расплывчато, и без примера псевдокода или фактического примера того, что вы пытались сделать, на это трудно ответить.

Но я понимаю, что вам нужно:

API-вызов 1:

{ ids: [1, 2, 3] }

API-вызов 2 принимает идентификатор (api (1), api (2), api (3) и т. Д.) И возвращает:

{ something: 'else', id: 1 }

В RxJS вы хотели бы switchMap для каждого полученного вами идентификатора, чтобы вы могли переключить подписку на новый Observable.Если вы хотите, чтобы все это вошло, когда они войдут, вы бы это сделали.Если вы хотите, чтобы они входили предсказуемо и по порядку, вы бы concat их.

Базовый пример:

this.http.get<{id: number[]}>('api1').pipe(
   switchMap(ids => {
      return concat(ids.forEach(id => {
           return this.http.get<{ something: string, id: number}>('api2/' + id)
      })
   }).subscribe(console.log)
...