开发者问题收集

通过循环使用.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