【发布时间】:2016-08-19 22:54:16
【问题描述】:
我正在尝试使用 Promise 来等待异步 forEach:
var forEachMatch = function(matches) {
var deferred = Q.defer();
matches.forEach(function(match) {
var messages = Message.find({'matchid': match._id}, function(err,messages) {
if(err)
console.log(err);
else
console.log(match._id);
});
});
return deferred.promise;
};
在这里使用:
forEachMatch(matches, function() {
console.log("DONE");
res.status(200).json({
bob,
matches: matches,
});
});
我的控制台输出如下:所有match._id 都已打印,但DONE 从未打印。
有解决办法吗?我从 node 和 promises 开始,所以我肯定会忘记一些东西,但我看不到什么。
感谢您的任何回答。
编辑
最终的解决方案,感谢 Alexander Mac:
var forEachMatch = function(matches) {
var promises = matches.map(match => {
return Message
.find({'matchid': match._id})
.populate({
path: 'fromUser toUser',
select: 'id firstname'
})
.then(messages => [match, messages])
.catch(err => {
console.log("Error in forEachMatch");
return [match, null];
});
});
return Q.all(promises);
}
forEachMatch(matches)
.then(messagesByMatch => {
res.status(200).json({
user,
messagesByMatch: messagesByMatch
});
});
【问题讨论】:
-
你的 forEachMatch 方法只接受一个参数,所以你的 DONE 回调永远不会被调用
标签: javascript node.js mongoose promise q