var arr = [{
    name:'Jack', delay:200
}, {
    name:'Mike', delay: 100
}, {
    name:'Freewind', delay:300
}, {
    name:'Test', delay: 50
}];

map

async.map(coll, iteratee, [callback])

对集合中的每一个元素,执行某个异步操作,得到结果。所有的结果将汇总到最终的callback里

  • 并行执行。同时对集合中所有元素进行操作,结果汇总到最终callback里。如果出错,则立刻返回错误以及已经执行完的任务的结果,未执行完的占个空位
  • 顺序执行。对集合中的元素一个一个执行操作,结果汇总到最终callback里。如果出错,则立刻返回错误以及已经执行完的结果,未执行的被忽略。
并行
async.map(arr, function(item, callback) {
    log('1.1 enter: ' + item.name);
    setTimeout(function() {
        log('1.1 handle: ' + item.name);
        callback(null, item.name + '!!!');
    }, item.delay);
}, function(err,results) {
    log('1.1 err: ', err);
    log('1.1 results: ', results);
});
// => results: [ 'Jack!!!', 'Mike!!!', 'Freewind!!!', 'Test!!!' ]

mapSeries

async.mapSeries(coll, iteratee, [callback])

顺序执行,一个完了才执行下一个。

async.mapSeries(arr, function(item, callback) {
    log('1.3 enter: ' + item.name);
    setTimeout(function() {
        log('1.3 handle: ' + item.name);
        callback(null, item.name+'!!!');
    }, item.delay);
}, function(err,results) {
    log('1.3 err: ', err);
    log('1.3 results: ', results);
});
// => results: [ 'Jack!!!', 'Mike!!!', 'Freewind!!!', 'Test!!!' ]

mapLimit

async.mapLimit(coll, limit, iteratee, [callback])

并行执行,同时最多 N 个函数并行,传给最终callback。

async.mapLimit(arr,2, function(item, callback) {
    log('1.5 enter: ' + item.name);
    setTimeout(function() {
        log('1.5 handle: ' + item.name);
        if(item.name==='Jack') callback('myerr');
        else callback(null, item.name+'!!!');
    }, item.delay);
}, function(err, results) {
    log('1.5 err: ', err);
    log('1.5 results: ', results);
});