Javascript 承诺链不等待承诺在结束前解决

Javascript 承诺链不等待承诺在结束前解决,javascript,node.js,promise,Javascript,Node.js,Promise,我尝试将这些简化一点: passData.savedDBGames.forEach((gameInfo) => { return new Promise((resolve, reject) => { stats.getPlayersStats(gameInfo.fixtureID).then((playerStats) => { playerStatsPromise.push(playerStats);

我尝试将这些简化一点:

      passData.savedDBGames.forEach((gameInfo) => {
        return new Promise((resolve, reject) => {
          stats.getPlayersStats(gameInfo.fixtureID).then((playerStats) => {
             playerStatsPromise.push(playerStats);
             console.info('Grab Done');
             resolve();
           });
        });
      });

      Promise.all(playerStatsPromise)
        .then(function () {
          console.info('All Done');
          app.io.emit('admin', 'Admin: done');
          resolve(passData);
        });
据我所知,
承诺。所有的
都应该等到
playerStatsPromise
中包含的所有承诺都得到解决后再进行

那么为什么
全部完成
抓取完成
之前完成


在构建数组时,您似乎引用了一个未定义的变量
data2
。相反,请使用
map
构建阵列,因为这将返回承诺:

  var playerStatsPromise = passData.savedDBGames.map((gameInfo) => {
    return new Promise((resolve, reject) => {
      stats.getPlayersStats(gameInfo.fixtureID).then((playerStats) => {
         console.info('Grab Done');
         resolve();
       });
    });
  });

  Promise.all(playerStatsPromise)
    .then(function () {
      console.info('All Done');
      app.io.emit('admin', 'Admin: done');
      resolve(passData);
    });
如果这是您在第一个代码块中所做的全部工作,您可以简化为:

  var playerStatsPromise = passData.savedDBGames
      .map(gameInfo => stats.getPlayersStats(gameInfo.fixtureID));

  Promise.all(playerStatsPromise)
    .then(function () {
      console.info('All Done');
      app.io.emit('admin', 'Admin: done');
      resolve(passData);
    });

在构建数组时,您似乎引用了一个未定义的变量
data2
。相反,请使用
map
构建阵列,因为这将返回承诺:

  var playerStatsPromise = passData.savedDBGames.map((gameInfo) => {
    return new Promise((resolve, reject) => {
      stats.getPlayersStats(gameInfo.fixtureID).then((playerStats) => {
         console.info('Grab Done');
         resolve();
       });
    });
  });

  Promise.all(playerStatsPromise)
    .then(function () {
      console.info('All Done');
      app.io.emit('admin', 'Admin: done');
      resolve(passData);
    });
如果这是您在第一个代码块中所做的全部工作,您可以简化为:

  var playerStatsPromise = passData.savedDBGames
      .map(gameInfo => stats.getPlayersStats(gameInfo.fixtureID));

  Promise.all(playerStatsPromise)
    .then(function () {
      console.info('All Done');
      app.io.emit('admin', 'Admin: done');
      resolve(passData);
    });

你的代码没有意义
forEach
特别意味着会产生副作用,但是你会在其中返回一个新的承诺。
data2
来自更大的承诺链@aaaaaa我这样做是为了强迫承诺被返还,这只是我的实验。你不应该创建一个
新承诺
,如果你在其中使用承诺,你应该直接使用它们作为返还。此外,如果
getPlayersStats
失败,您将破坏代码,因为您从未处理从
getPlayersStats
开始的链的拒绝情况。是的,我确实需要编写捕获。谢谢:你的代码没有意义
forEach
特别意味着会产生副作用,但是你会在其中返回一个新的承诺。
data2
来自更大的承诺链@aaaaaa我这样做是为了强迫承诺被返还,这只是我的实验。你不应该创建一个
新承诺
,如果你在其中使用承诺,你应该直接使用它们作为返还。此外,如果
getPlayersStats
失败,您将破坏代码,因为您从未处理从
getPlayersStats
开始的链的拒绝情况。是的,我确实需要编写捕获。谢谢:多德。。。我在其他地方都用过地图:)但出于某种原因,我的大脑放屁了。好奇怪的一个。。。我在其他地方都用过地图:)但出于某种原因,我的大脑放屁了。不错