我有两个循环,外部循环针对用户,内部循环针对每个用户的venueID。在内部循环中,我想查找 field 并将其附加到外部外观中定义的数组 (userItem
)。然而,由于 forEach 是同步的,而 mongo 数据库查找是异步的,因此结果始终保持为空。我尝试集成 this answer但无济于事。如何做到这一点?
ret = [];
users.forEach(function(user) {
var userItem = user.getSanitised('ADM');
userItem.venues = [];
var tmp = [];
userItem.adminVenueIds.forEach(function(adminVenueId){
tmp.push(function(callback) {
Venue.findOne({_id:adminVenueId}, function(error, venue) {
callback(null, venue.toObject());
});
});
});
async.parallel(userItem.venues, function(err, result) {
/* this code will run after all calls finished the job or
when any of the calls passes an error */
if (err)
return console.log(err);
userItem.venues.push(result);
});
ret.push(userItem);
});
也尝试了以下方法,但也不起作用
users.forEach(function(user) {
var userItem = [];
async.series({
setUserItem : function(callback)
{
userItem = user.getSanitised('ADM');
callback(null, 'OK');
},
setUserVenues : function(callback)
{
userItem.venues = [];
user.adminVenueIds.forEach(function(adminVenueId,index) {
Venue.findOne({_id:adminVenueId}, function(error, venue) {
userItem.venues.push(venue.toObject());
if((index+1) == user.adminVenueIds.length)
callback(null, 'OK');
});
});
}
},
function(error, results) {
if(error)
winston.error(error);
ret.push(userItem);
}
);
});
最佳答案
您可以简单地放置一个 if 语句(在您的情况下将条件作为数组长度),然后当循环完成时,您可以通过调用函数来继续执行它的操作(或者将您的代码放在那里) ,但它会开始看起来很乱)
var ret = [];
var test = [];
for (var i = 0; i < 20; i++) {
for (var x = 0; x < 20; x++) {
setTimeout(function() {
test.push("Test"+x);
if (x === 20) {
finishIt();
}
}, 300)
}
}
function finishIt() {
console.log(test);
ret.push(test);
}
关于javascript - 在内部 forEach 循环中集成异步 mongo 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30633672/