关于async模块的eachLimit方法的疑问
在看@bsspirit的async_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才执行完.