2016-12-15 161 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

奇怪...我用過其他地方的地圖:)但由於某種原因,我有一個大腦放屁。好一個 –