【发布时间】:2020-05-09 04:49:21
【问题描述】:
所以我想弄清楚为什么我的循环似乎没有按正确的顺序执行。这是工作线程在整理完值后进行的调用。
worker.on('message',function(data) {
console.log(data)
for (var i of data.entries) {
console.log(i.Email)
db.rota.checkUserHasShifts(i.Email,function(flag) {
if (flag) {
console.log('e', i.Email)
db.rota.getShiftsForUser(i.Email,function(err, shiftData) {
if (!shiftData) return
shiftData.Shifts = i.Shifts
shiftData.save(function(err) {
if (err) throw err;
})
})
} else {
console.log('n', i.Email)
var newShift = new db.rota({Email:i.Email,Shifts:i.Shifts})
newShift.save(function (err){
if (err) throw err
});
}
})
};
console.log("Spreadsheet processed")
})
对于一组 20 个条目,这将:
- 打印出 'data' 对象,数组中有 20 个
{Email:"someemail",Shifts:{date:time}}对象 - 按正确的顺序打印每封电子邮件
- 然后在列表中的最后一封电子邮件中执行 20 批 db 代码,在控制台中给我 20 行
n lastemail@example.com和在数据库中的 20 个相同条目。
预期的行为显然是在继续下一个之前等待每个条目,或者至少为集合中的每封电子邮件排队一个条目。 如何让循环等待并正确执行所有条目的 db.rota.checkUserHasShifts 方法和回调,而不仅仅是最后一个?
【问题讨论】:
-
所以,本质上,您是在问如何在每次迭代中等待
db.rota.checkUserHasShifts(i.Email,function(flag) {
标签: javascript mongodb asynchronous mongoose async-await