async模块是在es6标准出现前很好的异步编程解决方案

mapLimit接口

  • 调用方式:
async.mapLimit(paramsArr, limit, iterator, callback(err, result))
function iterator(params, callback){
    //TODO
    callback()
}
  • 参数说明:
    其中paramsArr为参数数组,limit为并发数限制,iterator为迭代函数,callback为回调函数,该接口会依次取出paramsArr数组中的每套参数,并将其传递给iterator函数,iterator利用该套参数进行运行处理,iteratorcallback函数会将最终的运行结果存放到mapLimitcallback函数的result字段中,这样,最终result的值实际上是一个数组,存放了paramsArr数组中的每个参数元素执行iterator后的结果,在mapLimitcallback中便可对结果集进行处理。该接口的执行是同步阻塞的,执行完毕前不会执行后续代码。
  • 代码示例
//参数数组,包含了两套参数
var paramArr = [
    {id: 1},
    {id: 2}
]
async.mapLimit(paramArr, 5, selectById, function(err, result){
    if(err)
        throw err
    //TODO
    //result中保存的即为在id=1和id=2下分别两次调用selectById函数得到的两条记录
    console.log(result[0])
    console.log(result[1])
})
//该函数根据id查询数据库得到一条记录
function selectById(param, cb){
    var query = 'selec * from user where id = :id'
    rtdbClient.execute(query, param, {prepare: true}, (err, res) => {
        if(err)
            cb(err)
        cb(null, res.rows[0])    //回调查询到的一条记录
    })
}

series接口

  • 调用方式
async.series([func1,func2,func3,...],callback(err,result))
  • 参数说明
    第一个参数为一个函数数组,第二个参数为回调函数,该接口会按顺序依次调用函数数组中的每个函数,且一个执行完毕后才会执行下一个,且这些函数之间不会有任何数据传输,函数全部执行完毕后,再执行callback函数进行相应处理。该接口的执行是同步阻塞的,执行完毕前不会执行后续代码。
  • 代码示例
//函数1
var func1 = function(){
    //TODO
}
//函数2
var func2 = function(){
    //TODO
}
async.series([func1,func2], function(err, result){
    if(err)
        throw err
    //TODO
    //func1和func2依次执行完毕后,执行此处回调
})

parallel接口

  • 调用方式
async.parallel([func1,func2,func3,...],callback(err,result))
  • 参数说明
    第一个参数为一个函数数组,第二个参数为回调函数,该接口会并行执行函数数组中的每个函数,数组中的每个函数不会相互等待,且没有数据交互,函数全部执行完毕后,再执行callback函数进行相应处理。该接口的执行是同步阻塞的,执行完毕前不会执行后续代码。
  • 代码示例
//函数1
var func1 = function(){
    //TODO
}
//函数2
var func2 = function(){
    //TODO
}
async.parallel([func1,func2], function(err, result){
    if(err)
        throw err
    //TODO
    //func1和func2并行执行,最后一个函数执行完毕后,执行此处回调
})

waterfall接口

  • 调用方式
async.waterfall([func1(callback), func2(param,callback), func3(param,callback),...],callback(err,result))
  • 参数说明
    第一个参数为一个函数数组,第二个参数为回调函数,该接口会按顺序依次执行函数数组中的每个函数,且前一个函数的callback输出是后一个函数的输入,最后一个函数的callback输出会传递给waterfallcallback函数中的result。该接口的执行是同步阻塞的,执行完毕前不会执行后续代码。
  • 代码示例
//函数1,有一个回调
var func1 = function(cb){
    //TODO
    cb(null, 'func1')
}
//函数2,有一个参数和一个回调
var func2 = function(param, cb){
    //TODO
    console.log(param + 'finished')        //此处param的值即为func1的回调值'func1'
    cb(null, 'func2')
}
//函数3,有一个参数和一个回调
var func3 = function(param, cb){
    //TODO
    console.log(param + 'finished')
    cb(null, 'func3')    //此处param的值即为func2的回调值'func2'
}
async.waterfall([func1, func2, func3], function(err, result){
    if(err)
        throw err
    //TODO
    console.log(result + 'finished')    //此处result的值即为func3的回调值'func3'
})
/*最终输出
func1 finished
func2 finished
func3 finished
*/