承诺不会按顺序执行javascript

我有下面的代码片段使用承诺执行。我有的问题是承诺没有执行顺序等待第一个块执行之前,继续下一个块

下面是代码:

array[] new Promise(function(resolve, reject) { //userarray is some array with user id's userarray.forEach(function(entry) { User.findOne({ user_id: entry}, function(err, user) { if (err) throw err; console.log(user.name); array.push(user.name); }); }); resolve("success"); }) .then(function() { console.log(array); console.log("done"); }); 

下面是输出

[] //数组仍然是空的

DONE

汤姆

迪克

掠夺

当我想要的是

汤姆

迪克

掠夺

[“汤姆”,“迪克”,“哈里”]

DONE

看起来像User.findOne会asynchronous调用它的callback,以便在实际调用callback之前解决您的承诺。 你可以尝试这样的事情:

 var promises = userarray.map(function(entry) { return new Promise(function(resolve, reject) { User.findOne({ user_id: entry}, function(err, user) { if (err) reject(err); console.log(user.name); resolve(user.name); }); }); }); Promise.all(promises).then(function(array) { console.log(array); console.log("done"); }); 

这个解决scheme不是很高雅,但应该完成工作。

 var length = userarray.length; userarray.forEach(function(entry) { User.findOne({ user_id: entry}, function(err, user) { if (err) throw err; console.log(user.name); array.push(user.name); if(!--length) resolve("success"); }); }); })