2 回答
TA贡献1818条经验 获得超11个赞
您的问题是,虽然每个单独的请求都是异步的,但您在所有 150 个请求完成之前都会返回。在下面的 for 循环中,不是链接到请求并立即推送,而是将 promise 推送到数组中。然后,在循环之后,返回一个 Promise,一旦请求了所有 150 个 Promise 并将其推送到数组中,该 Promise 就会解析。fetchrequestspokemons
const fetchPokemon = function() {
const pokemons = [];
const requests = [];
for (let i = 1; i <= 150; i++) {
const url = `https://pokeapi.co/api/v2/pokemon/${i}`;
const prom = fetch(url).then((r) => r.json());
requests.push(prom);
}
return new Promise((resolve) => {
Promise.all(requests)
.then((proms) =>
proms.forEach((p) => pokemons.push({
name: p.name,
id: p.id
}))
)
.then(() => resolve(pokemons));
});
};
fetchPokemon().then(console.log);
TA贡献1809条经验 获得超8个赞
在这里发布这个,作为一个更简单,更简洁和最好的例子使用异步/等待。
并行 fetch,具有迭代第一个顺序就绪 fetch 响应的功能。即:如果前 25 个 fetch 完成,它将按顺序迭代前 25 个,而无需等待后一个 125。
const fetchPokemon = async function() {
const pokemons = [];
for (let i = 1; i <= 150; i++) {
const url = `https://pokeapi.co/api/v2/pokemon/${i}`;
const data = fetch(url).then(res => res.json())
.then( ({name, id}) => ({name, id}) );
pokemons.push(data);
}
for await (const pokemon of pokemons) {
console.log(pokemon);
}
// or if you need to use the index:
for (let i = 0; i < pokemons.length; i++) {
console.log(await pokemon[i]);
}
};
fetchPokemon();
添加回答
举报