通过循环使用.push() 后数组显示为空?
2017-01-10
1610
我不确定这是否与我尝试将数据保存到数组的方式有关,但使用 console.log 数组似乎为空,因此无法显示其中的数据。请查看我当前的代码是否结构正确:
我想确认 matchIds 是否确实包含一个数据数组:
var getGameData = function (matchIds) {
console.log('Executing getGameData');
return new Promise(function (resolve, reject) {
var gameData = [];
for (var i = 0; i < matchIds.length; i++) {
lolapi.Match.get(matchIds[i], function (error, gamedata) {
if (error) {
return reject(error);
}
if (gamedata) {
gameData.push(gamedata);
}
});
if (i === 9) {
resolve(gameData);
}
}
});
};
1个回答
您的 proimse 主体中还有另一部分异步代码(根据您的结果,我假设它是异步的):
lolapi.Match.get(matchIds[i], function (error, gamedata) { ...
因此,在循环结束时(for),您的
gameData.push(gamedata);
指令(来自多个回调)将不会被执行,因此
resolve(gameData);
将是 []。
您可以使用 Promise.all 方法:
var gameDataPromises = [];
for (var i = 0; i < matchIds.length; i++) {
gameDataPromises.push(new Promise(function(res, rej) { lolapi.Match.get(matchIds[i], function (error, gamedata) {
if (error) {
rej(error);
}
if (gamedata) {
res(gamedata);
}
})}));
}
Promise.all(gameDataPromises).then(resolve).catch(reject)
这将有效地在一个等待所有
lolapi.Match.get
的单个 Promise 中捕获所有 - 如果一个失败,则将调用主承诺的拒绝 - 如果全部成功,则所有内部调用的数据将作为数组传递给主承诺的解析(我猜这是您所期望的)。
Ovidiu Dolha
2017-01-10