# 1.async简述
# 为了适应异步编程,减少回调的嵌套。
- git仓库开源地址:https://github.com/caolan/async
- 官方文档地址:http://caolan.github.io/async/v3/docs.html
# Async的内容分为三部分:
- 流程控制:简化十种常见流程的处理
- 集合处理:如何使用异步操作处理集合中的数据
- 工具类:几个常用的工具类
# 由于nodejs是异步编程模型,有一些在同步编程中很容易做到的事情,现在却变得很麻烦。Async的流程控制就是为了简化这些操作。
# 2.串行执行
# 函数间无关联
# async.series([task1,task2,....],callback)
- 有多个异步函数需要依次调用
- 一个完成之后才能执行下一个
- 各函数之间没有数据的交换,仅仅需要保证其执行顺序
async.series([
function(callback){
// do something
callback(null,1)
},
function(callback){
// do something
callback(null,2)
}
],function(err,result){
if(err){
// do something
}else{
// do something
}
})
# 具体流程规则执行如下:
- 列表中的function中的callback使用规则:
- 第一个参数为null表示程序正常往下执行,第二个参数开始为最后一个function的result值,追加模式
- 第一个参数非null表示程序终止,直接跳转到执行最后一个function回调函数,第二个参数开始为最后一个function的result值,追加模式
- 无论所有的函数是否都正常执行,回调函数一定会被执行

# 函数间参数传递
async.waterfall([
function(callback){
// do something
callback(null,1)
},
function(arg1,callback){
// do something
callback(null,2)
}
],function(err,result){
console.log('err:'+err)
console.log('result:'+result)
})
# 具体流程规则执行如下:
- 列表中的function中的callback使用规则:
- 第一个参数为null表示程序正常往下执行,第二个参数开始为下一个函数的参数
- 第一个参数非null表示程序终止,直接跳转到执行最后一个function回调函数,第二个参数开始为最后一个function的result值
- 无论所有的函数是否都正常执行,回调函数一定会被执行

# 3.并行执行
# 3.1 并行执行多个函数
# async.parallelLimit([task1,task2....],num,callback)
- 并行执行多个(num为个数并发限制)函数
- 传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。
- 如果某个函数出错,则立刻将err和已经执行完的函数的结果值传给parallel最终的callback,其它未执行完的函数的值不会传到最终数据。
async.parallelLimit([
function(callback){
setTimeout(function(){
// do something
callback(null,11)
},2000)
},
function(callback){
setTimeout(function(){
// do something
callback(null,22)
},2000)
},
function(callback){
setTimeout(function(){
// do something
callback(null,33)
},2000)
},
function(callback){
setTimeout(function(){
// do something
callback(null,44)
},2000)
},
......
],2,function(err,result){
console.log(err)
console.log(result)
})
# 3.2 对集合或者数组遍历并发执行
# async.mapLimit(Array | Iterable | AsyncIterable | Object,limit,AsyncFunction,callback)
# limit : 并发数
# AsyncFunction : 并发的函数
# callback : 回调函数
var hosts=['www','ns','abc','login','test']
async.mapLimit(hosts,3,function(item,callback){
dns.resolve(item+'.baidu.com', (err,records)=>{
if(!err){
console.log(item+'.qq.com:'+records);
callback(null,records)
}else{
// console.log(err);
callback(null)
}
})
},function(err,result){
console.log('err:'+err);
console.log('result:'+result)
})
//备注:
1.依次从hosts取出1个数据赋值给item
2.并发3个function执行
← mysql