关于async模块的eachLimit方法的疑问
发布于 10 年前 作者 yukjin 7235 次浏览 最后一次编辑是 8 年前 来自 问答

在看@bsspiritasync_demo时,看到demo作者说eachLimit方法是分批执行,同一批内并行,批与批之间按顺序。请问如何理解这句话的意思? 我看了源码怎么感觉eachlimit只是对同时运行的任务个数做了限制,如果给前面的任务足够的延迟,后面任务就会在前面任务执行完成前完成,请问批与批之间的执行顺序是怎么体现的?

1 回复

感觉你是对的. 稍微修改下作者的代码, 也可以验证:

var async = require('async');

var arr = [{name:'#1', delay: 100},   // 修改了下delay的值
           {name:'#2', delay: 800},    // #2 的delay 设置得较长
           {name:'#3', delay: 100},
           {name:'#4', delay: 200},
           {name:'#5', delay: 300},
           {name:'#6', delay: 400}];

var t = new Date();  // 记录个时间
async.eachLimit(arr, 2, function(item, callback) {
    log('1.5 enter:  ' + item.name + ' - ' + item.delay);
    setTimeout(function(){
        log('1.5 handle: ' + item.name);
        callback(null, item.name);
    }, item.delay);
}, function(err) {
    log('1.5 err: ' + err);
});

function log(msg) {
  console.log('%s> %s', pad(new Date() - t, 4), msg);
}

function pad(n, width, z) {  // 前缀一些'0'
  z = z || '0';
  n = n + '';
  return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

程序输出为: 0007> 1.5 enter: #1 - 100 0009> 1.5 enter: #2 - 800 0110> 1.5 handle: #1 0110> 1.5 enter: #3 - 100 0211> 1.5 handle: #3 0212> 1.5 enter: #4 - 200 0412> 1.5 handle: #4 0412> 1.5 enter: #5 - 300 0713> 1.5 handle: #5 0713> 1.5 enter: #6 - 400 0810> 1.5 handle: #2 1114> 1.5 handle: #6 1115> 1.5 err: undefined

可以看到#2在队列中很久, #3, #4和#5都执行完后, #2才执行完.

回到顶部