javascript - Async.eachSeries 并行执行

标签 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 的两次调用。我希望仅在 user1getEarnings 返回后调用 user2 的函数 getEarnings (并且相应的回调已被调用)制成)。

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

我希望这已经足够清楚了。

最佳答案

问题在于您调用回调的位置。示例:

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。

关于javascript - Async.eachSeries 并行执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45085928/

相关文章:

javascript - 在 Angular 中执行前一个响应后执行一个函数

javascript - 在 Node 中将循环转换为异步

javascript - 异步内存 - 理解源代码

javascript - JavaScript 中一组数字的随机排列

javascript - 异步工作的生成器函数

c# - 在 C# 中将 while 循环与 Task.Run() 相结合

javascript - Promise 范围在执行时不同

javascript - 使用调试版本替换 Chrome 的 V8 版本

javascript - 手动写入后无法使用 javascript 更新 textarea

python - 下载大约 15000 个 URL 的元内容 Python - 线程