2016-12-15 127 views
0

我试图简化这些倒有几分之前解决:无极链不等待承诺结束

 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

+0

什么是'数据2 '? – trincot

+0

你的代码没有意义。特别是'forEach'是为了引起副作用,但是你要在它内部返回一个新的Promise。 – aaaaaa

+0

'data2'来自更大的承诺链。 @aaaaaa我做到了这一点,试图强制承诺退还,这只是我试验。 –

回答

2

你似乎构建阵列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); 
    }); 
+0

奇怪...我用过其他地方的地图:)但由于某种原因,我有一个大脑放屁。好一个 –