通过循环使用.push()后,数组显示为空?

时间:2017-01-10 09:19:04

标签: javascript arrays

我不确定它的todo是如何尝试将数据保存到数组但使用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 个答案:

答案 0 :(得分: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)

这将有效地捕获所有等待所有它们的Promise中的所有lolapi.Match.get - 如果一个失败将拒绝主要承诺的拒绝 - 如果一切成功,那么来自所有内部的数据调用将作为数组传递给您的主要承诺的决心(我猜你想到的)。