gpt4 book ai didi

javascript - 在内部 forEach 循环中集成异步 mongo 调用

转载 作者:太空宇宙 更新时间:2023-11-04 00:54:28 24 4
gpt4 key购买 nike

我有两个循环,外部循环针对用户,内部循环针对每个用户的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com