【发布时间】:2020-05-16 14:59:56
【问题描述】:
我正在用纯 JavaScript 编写应用程序。我遇到了一个问题,当将 150 个对象放入数组时,数组中的一些对象是未定义的。当我在将对象推入数组之前对其进行 console.log 时,它们很好,并且所有 150 个对象都会显示。但是当我将它们推送到数组时,有些是未定义的,有些确实被成功推送了。我的理解是,这可能是序列问题的时间问题,对于某些对象,它们可能尚未完全获取,但推送到数组已经发生。有没有办法确保它们是有序的,以便只有在完全成功获取对象后才会推送数组?感谢您的帮助。
const fetchPokemon = function () {
const pokemons = [];
for ( let i=1; i <= 150; i++) {
const url = `https://pokeapi.co/api/v2/pokemon/${i}`;
fetch(url).then( res => { return res.json(); })
.then( data => {
const pokemon = {
name: data.name,
id: data.id
};
pokemons.push(pokemon);
console.log(pokemon);
console.log(pokemons[i]);
});
}
};
fetchPokemon();
输出 - 根据未定义的数组元素,页面的不同重新加载会有所不同
app.js:17 undefined
app.js:16 {name: "dragonite", id: 149}
app.js:17 undefined
app.js:16 {name: "mewtwo", id: 150}
app.js:17 undefined
app.js:16 {name: "kingler", id: 99}
app.js:17 {name: "electrode", id: 101}
app.js:16 {name: "aerodactyl", id: 142}
app.js:17 {name: "zapdos", id: 145}
app.js:16 {name: "dratini", id: 147}
app.js:17 {name: "kingler", id: 99}
【问题讨论】:
-
我认为这不是时机,您正在使用应在 fetch 任务完成时运行的承诺。您正在对 pokemon api 进行 150 次独立调用,这些 id 是否存在 pokemon?是否有一条路线可以让您一次性检索列表而不是 150 次?需要打很多电话
-
在 pokemons[i] 中,我会在执行该行时引用循环变量值,但数组可能还没有获取和推送那么多值。我建议不要依赖循环内回调中的
i变量。附注 - 看看 async/await 而不是回调。 -
要查看被推入数组的内容,您可以这样做
console.log(pokemons[pokemons.length-1]);
标签: javascript arrays asynchronous fetch