Promise Chain在结束

时间:2016-12-15 20:58:26

标签: javascript node.js promise

我试图将这些简化一下:

      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);
        });

据我所知Promise.all应该等到playerStatsPromise中包含的所有承诺都解决了?

那么为什么All DoneGrab Done之前完成?

enter image description here

1 个答案:

答案 0 :(得分:2)

在构建数组data2时,您似乎引用了未定义的变量playerStatsPromise。而是使用map来构建您的数组,因为这将返回promise:

  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);
    });