一、why?为什么要使用async
因为嵌套回调的问题:
eg:
async1(function(){
async2(function(){
async3(function(
async4(funciton(){
async5(function(){
//...
});
});
));
});
});
so:
我们可以使用async来使结果更清晰,代码更容易理解,并且耦合度不是那么高
二、How?怎么用
npm 安装好async模块,
npm i async -s
然后引入就可以使用
var async = require('async');
这里保留最常用的三个
1. async.series(tasks,[callback])
多个函数从上到下依次执行,相互之间没有数据交互
var task1 =function(callback){
console.log("task1");
callback(null,"task1")
}
var task2 =function(callback){
console.log("task2");
callback(null,"task2")
}
var task3 =function(callback){
console.log("task3");
callback(null,"task3")
}
async.series([task1,task2,task3],function(err,result){
console.log("series");
if (err) {
console.log(err);
}
console.log(result);
})
运行结果:
最后的返回是一个按顺序执行的回调结果数组,
如果中途发生错误,则将错误传递到回调函数,并停止执行后面的函数
结果数组中也不会占位置
eg:
2.async.parallel(tasks,[callback])
多个函数并行执行,不会等待其他函数
var task1 =function(callback){
console.log("task1");
setTimeout(function(){
callback(null,"task1")
},5000);
}
var task2 =function(callback){
console.log("task2");
setTimeout(function(){
callback(null,"task2")
},1000);
}
var task3 =function(callback){
console.log("task3");
setTimeout(function(){
callback(null,"task3")
},3000);
}
console.time("parallel方法");
async.parallel([task1,task2,task3],function(err,result){
console.log("parallel");
if (err) {
console.log(err);
}
console.log(result);
console.timeEnd("parallel方法");
})
运行结果:
3个函数分别延迟5000ms,1000ms,3000ms 结果5000ms就执行完毕.
如果中途出错,则立即将err和值传到最终的回调函数,其他未执行完毕的函数将不再执行,但是结果数组中会占一个位置
eg:
3.waterfall(tasks,[callback]) :瀑布流
依次执行,前一个函数的输出为后一个函数的输入
var task1 =function(callback){
console.log("task1");
callback(null,"11")
}
//除了callback还有一个q,是上一级的传参
var task2 =function(q,callback){
console.log("task2");
console.log("task1函数传入的值: "+q);
callback(null,"22")
}
var task3 =function(q,callback){
console.log("task3");
console.log("task2函数传入的值: "+q);
callback(null,"33")
}
console.time("waterfall方法");
async.waterfall([task1,task2,task3],function(err,result){
console.log("waterfall");
if (err) {
console.log(err);
}
console.log("result : "+result);
console.timeEnd("waterfall方法");
})
执行结果:
返回的不是结果数组,而是一个唯一结果
如果中途出现错误,后面的函数将不在执行,之前执行的结果和错误信息将直接传到最终的回调函数
如果前后数据有传递关系的话,可以用这个
POST:https://blog.csdn.net/zzwwjjdj1/article/details/51857959