我正在尝试从node.js了解async
库并应用它,但它无法按预期工作。当我期望它们是连续制作时(即一个接一个地),被称为并行制作
这是我的代码
var users = [{_id:'1',username:'user1'},{_id:'2',username:'user2'}];
async.eachSeries(users,function function1(user,callbackEach){
var username = user.username;
var incomes = [{source:'sourceA',provider:providerA},{source:'sourceB',provider:providerB},{source:'sourceC',provider:providerC}];
async.eachSeries(incomes,function function2(income,callbackSmallEach){
var source = income.source;
income.provider.getEarnings(user._id,username,yesterday,function callbackFromGetEarnings(err,result){
if (err){
// error
} else {
income.earnings = {day : new Number(result)};
income.provider.getMonthEarnings(user._id,username,yesterday,function callbackFromGetMonthEarnings(err,monthTotal){
if (err){
// error
} else {
income.earnings.month = new Number(monthTotal);
callbackSmallEach();
}
});
}
});
},
function sendEmails(err){
if (err) {
// error
} else {
// send email
}
});
console.log("Just before calling callbackEach()");
callbackEach();
});
getEarnings
和getMonthEarnings
使用外部提供程序,因此在调用回调函数callbackFromGetEarnings
和callbackFromGetMonthEarnings
之前可能会有一段时间。
我的问题是我不希望同时执行对getEarnings
的两次调用。我希望getEarnings
的函数user2
仅在getEarnings
返回user1
后才会被调用(并且已经进行了相应的回调)。
正如您所看到的,我尝试使用async.eachSeries
在系列中调用user1和2,但是并行调用。执行时,在调用回调函数Just before calling callbackEach()
之前始终执行日志callbackFromGetEarnings
...
我希望这很清楚。
答案 0 :(得分:1)
问题在于您呼叫回叫的位置。例如:
async.eachSeries(something, function(item, callback) {
async.eachSeries(item.somethingElse, function(subitem, callback2) {
//do something
return callback2();
}, function() {
//when all item.somethingElse is done, call the upper callback
return callback();
})
}, function() {
console.log('done');
})
这样,对于某个项目中的每个项目,您将在进入下一个项目之前执行所有item.somethingElse的系列执行。