#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 с аналогичным вариантом использования это также содержит пример обещания