Это происходит потому, что promise.then()
выполняет асинхронную операцию. Поэтому, когда вы возвращаете new Pokemon()
, переменные спрайта не всегда могут быть установлены. Поэтому вам нужно дождаться завершения асинхронных операций.
Итак, для второго отображения вместо map
вы можете использовать switchMap
из rxjs
, чтобы подписаться на внутреннюю наблюдаемую / цепочку наблюдаемых. А в switchMap
вы можете объединить массив наблюдаемых с combineLatest
, чтобы получить ответы наблюдаемых в виде массива. Как ниже:
getPokemons = () => {
return this._httpClient.get(apiUrl).pipe(
map((resp: any) => {
if (resp.results.length == 0) {
this.lastPageOfResults = resp.next == null;
this.router.navigate(['/404']);
}
this.lastPageOfResults = resp.next == null;
return resp.results;
}),
switchMap((pokemonList) => {
const listOfObservables = [];
_.map(pokemonList, (pkmn) => {
let frontSprite: string;
let shinySprite: string;
const spriteObservable = this.getPokemonSprites(pkmn.name).pipe(
map((sprite) => {
let frontSprite = sprite.front_default;
let shinySprite = sprite.front_shiny;
return new Pokemon(pkmn.name, frontSprite, shinySprite);
})
)
listOfObservables.push(spriteObservable);
});
return combineLatest(listOfObservables);
})
)
}
Затем, когда вы вызываете метод getPokemons
(я назвал его, чтобы показать, как использовать), он возвращает цепочку наблюдаемой. Когда вы подписываетесь, он возвращает массив Pokemon
:
getPokemons.subscribe((pokemonList: Array<Pokemon>) => {
// do the fancy stuff with pokemonList array
})
Надеюсь, это поможет.
Рекомендации:
объединитьПоследние: https://www.learnrxjs.io/operators/combination/combinelatest.html
switchMap: https://www.learnrxjs.io/operators/transformation/switchmap.html