Как я могу сделать запрос, за которым следует массив запросов из этого ответа?

#angular #typescript #ionic-framework #ionic3

#angular #typescript #ionic-framework #ionic3

Вопрос:

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

Для простоты предположим, что первый запрос API возвращает список покемонов.

getPokemon()

 "objects" :[
 { "name": "Bulbasaur", "id": "1234"}, 
 { "name": "Squirtle", "id": "4321" },
 ...
]
  

Что мне нужно сделать, так это для каждого из этих возвращенных покемонов мне нужно сделать отдельный запрос для получения более подробной информации о покемоне, используя идентификатор.

getPokemonDetails( id: "1234" )

 "data" : { 
   "age": "12", 
   "height": "2 feet", 
    ... }
  

Изображение Я пытаюсь составить список всех высот покемонов. Мне нужны подробности из каждого отдельного запроса после выполнения родительского запроса getPokemon.

Каждый запрос возвращает обещание.

Что-то, что я пробовал, но не работает:

 this.provider.getPokemon().then(results => {
   foreach pokemon in results {
       this.provider.getPokemonDetails(pokemon.id).then(detail => {
           myData.push(detail.height)
       })
   }
})
  

Похоже, что существует проблема со временем этого.

Как я могу это сделать в Ionic 3?

Несколько вещей, которые, кажется, бросаются мне в глаза : forkJoin, map, mergeMap … что я ищу?

Комментарии:

1. Пожалуйста, уточните: действительно ли ваши запросы API настроены как обещания или наблюдаемые? Ваши примеры, похоже, предполагают обещания, но вы спрашиваете о методах, специфичных для наблюдаемых.

2. @miqh они настроены как обещания. Извините за это!

Ответ №1:

Попробуйте это:

 this.provider.getPokemon().then(results => {
     results.map(pokemon => {
         this.provider.getPokemonDetails(pokemon.id).then(detail => {
              myData.push(detail.height);
         });
     });
});
  

Ответ №2:

Вы можете использовать forkJoin для объединения нескольких отправленных HTTP-запросов. Позвольте мне показать пример:

 this.provider.getPokemon().flatMap(results => {
   const ids = results.objects.map(result => result.id)
   const observables = ids.forEach(id => this.provider.getPokemonDetails(id))
   return forkJoin(observables)
}).subscribe(result => console.log(result);
  

Stackblitz с аналогичным вариантом использования это также содержит пример обещания