对Async的eachLimit的疑问
发现使用eachLimit,限制为2批次,但是发现和期望的不一样。实际结果不是等到第一批的Jack
, Mike
执行完后,才继续执行第二批的Freewind
。而是第一批次里面只要有调用的callback
就会开始第二批次的Freewind
。
看到async_demo里面的注释是:分批执行,第二个参数是每一批的个数。每一批内并行执行,但批与批之间按顺序执行。
我对注释的理解是,第一批执行完成之后才会去执行第二批,但是实际是第一批里面有callback调用,则会执行第二批。
var async = require('async')
var log = console.log
var arr = [{name:'Jack', delay: 200},
{name:'Mike', delay: 10000},
{name:'Freewind', delay: 300}];
// 第一批[jack, mike], 第二批[freewind]
// 似乎是当调用了 callback, 就会开始下一批
async.eachLimit(arr, 2, function(item, callback) {
log('1.5 enter: ' + item.name);
setTimeout(function(){
log('1.5 handle: ' + item.name);
if(item.name == 'Jack') {
callback(null, item.name);
}
}, item.delay);
}, function(err) {
log('1.5 err: ' + err);
});
// 输出
// 1.5 enter: Jack
// 1.5 enter: Mike
// 1.5 handle: Jack
// 1.5 enter: Freewind
// 1.5 handle: Freewind
// 1.5 handle: Mike
2 回复
这里limit个数的意思应该是 “同时最多有limit个任务在跑” 不是分为两批次吧。。
@albin3 按照兄台的提示,修改了下代码,看运行结果,limit确实是最多有多少个任务再跑。谢谢!
var arr = [{name:'Jack', delay: 2000},
{name:'Mike', delay: 5000},
{name:'Freewind', delay: 4000},
{name:'youqing', delay:4000},
{name:'youqing2', delay:4000},
{name:'youqing3', delay:4000},
{name:'youqing4', delay:4000},
];
async.eachLimit(arr, 2, function(item, callback) {
log('1.5 enter: ' + item.name);
setTimeout(function(){
log('1.5 handle: ' + item.name);
callback(null, item.name);
}, item.delay);
}, function(err) {
log('1.5 err: ' + err);
});