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
开始的链的拒绝情况。是的,我确实需要编写捕获。谢谢:多德。。。我在其他地方都用过地图:)但出于某种原因,我的大脑放屁了。好奇怪的一个。。。我在其他地方都用过地图:)但出于某种原因,我的大脑放屁了。不错