我不确定它是否与我试图将数据保存到阵列的方式有关,但是使用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);
      }
    }
});
};

最佳答案

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-如果一个失败,则将调用对您的主要诺言的拒绝-如果所有成功,则来自所有内部调用的数据将传递给解决您的主要承诺作为一个数组(你所期待的我猜)。

08-25 10:14