对Async的eachLimit的疑问
发布于 8 年前 作者 youqingkui 5720 次浏览 来自 问答

发现使用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);
});

回到顶部