Async.eachSeries并行执行

时间:2017-07-13 16:04:48

标签: javascript asynchronous async.js

我正在尝试从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();
        });

getEarningsgetMonthEarnings使用外部提供程序,因此在调用回调函数callbackFromGetEarningscallbackFromGetMonthEarnings之前可能会有一段时间。

我的问题是我不希望同时执行对getEarnings的两次调用。我希望getEarnings的函数user2仅在getEarnings返回user1后才会被调用(并且已经进行了相应的回调)。

正如您所看到的,我尝试使用async.eachSeries在系列中调用user1和2,但是并行调用。执行时,在调用回调函数Just before calling callbackEach()之前始终执行日志callbackFromGetEarnings ...

我希望这很清楚。

1 个答案:

答案 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的系列执行。