我的Process1()
函数有一个数据库循环,因此Process2()
和Process3()
调用多次。我应该在async
中使用哪种功能来等待for loop
?
async.waterfall([
function(callback){
Process1(yyy, function(){
//process1 function has a for loop.
callback();
})
},
function(callback){
Process2(function(){
// so process2() is calling more than once
callback();
})
}
], function (callback) {
Process3()
});
Process1():
function Process1(yyy, pass){
user.find({}).exec(function(e, users){
_.each(users, function(_user){
user.findOneAndUpdate(
{'_id' : user_id},
{$inc : {'xxx' : yyy}},
function(e){
!e && pass()
})
})
})
}
答案 0 :(得分:1)
查看您的代码,Process2
肯定会被多次调用,因为lodash
和underscore
不会等到回调发生。它们只是实用程序方法。
要解决此类asynchronous
种情况,请使用async.each
或async.eachSeries
。
function Process1(yyy, pass){
user.find({}).exec(function(e, users){
async.each(users, function(_user, next){
user.findOneAndUpdate(
{'_id' : user_id},
{$inc : {'xxx' : yyy}},
function(e){
!e && next()
})
}, function(err) {
pass();
})
})
}