Async 是一个实用模块,它为使用异步 JavaScript 提供了直接、强大的功能。虽然最初设计用于Node.js,但它也可以直接在浏览器中使用。
安装
npm install --save async
使用
async的常用方法有series、parallel、waterfall、auto
1. series
依次运行tasks集合中的函数,每个函数在前一个函数完成后运行。如果系列中的任何函数将错误传递给其回调,则不再运行任何函数,并callback立即使用错误的值调用。否则,在完成后callback 接收结果数组。
const async =require("async");
async.series([
function(callback){
callback(null,'1')
},
function(callback){
callback(null,'2');
}
],function(err,result){
console.log(err);
console.log(result);
});
运行结果:
注意当Task的err参数不为空时,执行完当前,后边不再执行
const async =require("async");
async.series([
function(callback){
callback("err",'1')
},
function(callback){
callback(null,'2');
}
],function(err,result){
console.log(err);
console.log(result);
});
结果如下:
2.parallel
并行运行tasks函数集合,无需等到前一个函数完成。如果任何函数将错误传递给其回调,callback则会立即使用错误值调用 main。一旦tasks完成,结果将 callback作为数组传递给最终结果。
注意: parallel是关于并行启动 I/O 任务,而不是关于代码的并行执行。如果您的任务不使用任何计时器或执行任何 I/O,它们实际上将被串行执行。每个任务的任何同步设置部分都将一个接一个地发生。JavaScript 仍然是单线程的。
提示:用于reflect在任务失败时继续执行其他任务。
例如:
const async=require('async');
async.parallel([
function(callback){
setTimeout(()=>{
console.log("first Task");
callback(null,"1");
},1000)
},
function(callback){
setTimeout(()=>{
console.log("second Task");
callback(null,"2");
},100)
}
],function(err,result){
console.log(err);
console.log(result);
});
结果如下:
分析:
结果保持task添加顺序,而执行是异步的。
当发生错误时,立即调用完成函数,仍会把所有task执行完毕。
const async=require('async');
async.parallel([
function(callback){
setTimeout(()=>{
console.log("first Task");
callback(null,"1");
},1000)
},
function(callback){
setTimeout(()=>{
console.log("second Task");
callback("err","2");
},100)
}
],function(err,result){
console.log(err);
console.log(result);
});
结果:
3.waterfall
依次运行tasks函数数组,每个函数将其结果传递给数组中的下一个。但是,如果任何tasks一个将错误传递给他们自己的回调,则不会执行下一个函数,并且callback会立即调用 main 并返回错误
const async=require('async');
async.waterfall([
function(callback){
setTimeout(()=>{
callback(null,1,2)
},3000)
},
function(param1,param2,callback){
setTimeout(()=>{
//console.log(param1,param2);
callback(null,3)
},100)
}
],
function(err,result){
console.log(err);
console.log(result);
})
结果如下:
分析:
result返回的是最后Task的结果
4.auto
根据要求确定运行AsyncFunction的最佳顺序tasks。每个功能可以选择依赖于其他功能先完成,并且每个功能在满足其要求后立即运行。
如果任何AsyncFunction将错误传递给它们的回调,则auto序列将停止。进一步的任务将不会执行(因此任何其他依赖于它的函数都不会运行),并且callback会立即调用 main 并显示错误。
例如:
const async=require('async');
async.auto(
{
func1:function(callback){
setTimeout(()=>{
callback(null,'func1');
},3000)
},
func2:function(callback){
callback(null,'func2');
},
func3:["func1",function(param1,callback){
callback(null,'func3')
}]
},
function(err,result){
console.log(err,result);
}
);
结果如下:
中间能获取当前运行结果参数
const async=require('async');
async.auto(
{
func1:function(callback){
setTimeout(()=>{
console.log('func1');
callback(null,'func1');
},3000)
},
func2:function(callback){
console.log('func2')
callback(null,'func2');
},
func3:["func1",function(param1,callback){
console.log("param1:"+JSON.stringify(param1))
console.log('func3')
callback(null,'func3')
}]
},
function(err,result){
console.log(err,result);
}
);