async
waterfall:
async.waterfall(tasks,[callback]);
按顺序依次执行一组函数。每个函数产生的值,都将传给下一个。中途出错,后面的将不会执行。不支持json格式tasks
async.waterfall([
function(cb){
cb(null,1); //callback(err,result);1会作为下一个的参数
},
function(n,cb){ //n=1
cb(null,2+n)
}
],function(err,result){
console.log('err:',err,result); //err:null 3
})
async.waterfall([
function(callback){
callback(null, 'one', 'two');
},
function(arg1, arg2, callback){
// arg1 -> 'one' and arg2 -> 'two'
callback('this is err', 'three');
},
function(arg1, callback){
callback(null, 'done'); //如果中途没错,这里done会在最后显示
}
], function (err, result) {
console.log(err,result); // this is err three
});
series:
series(tasks, [callback])
串行执行,一个函数数组中的每个函数,每一个函数执行完成之后才能执行下一个函数。如果任何一个函数向它的回调函数中传了一个error,则后面的函数都不会被执行,并且会立刻将该error以及已经执行了的函数的结果,传给series中最后那个callback。如果没有出错,回调函数的结果合并为一个数组,还可以json的形式来提供tasks。每一个属性都会被当作函数来执行,并且结果也会以json形式传给series最后的那个callback。
//普通格式
async.series([
function(cb){
cb(null,3);
},
function(cb){
cb(null,4);
}
],function(err,result){
console.log(result) // [3,4]
})
//json格式,返回也是json
async.series({
one : function(cb){
cb(null,1);
},
two : function(cb){
cb(null,2);
}
},function(err,result){
console.log(result); // {one: 1,two: 2}
})
//中途出错
async.series([
function(cb){
cb(null,1);
},
function(cb){
cb('this is err',2);
},
function(cb){
cb(null,3);
}
],function(err,result){
console.log(err,result); //this is err [ 1, 2 ]
})
each:
each(arr, iterator(item, callback), callback(err))
对同一个集合中的所有元素都执行同一个异步操作,如果中途出错,错误将上传给最终的callback,其他启动的继续执行,未启动的忽略。全部未出错,最终得到的err为null
var arr = [
{name:'Jack', delay: 200},
{name:'Mike', delay: 100},
{name:'Freewind', delay: 300}
];
async.each(arr,function(item,callback){
console.log('itme:',item.name); //基本按照顺序打印
setTimeout(function(){
console.log('setTime:',item.name); //有delay,顺序会是Mike,Jack,Freewind
callback(null,item.name); //@1
},item.delay);
},function(err){
console.log(err); // 如果@1有callback 这里就是null
})
//中途出错
async.each(arr,function(item,callback){
console.log('item:',item.name); //也是顺序打印
setTimeout(function(){
console.log('setTime:',item.name); //打印Mike Jack
if(item.name === 'Jack'){
callback('this is err');
}
},item.delay);
},function(err){
console.log(err); //打印 this is err 之后会打印出Freewind
})
顺序是:
item: Jack
item: Mike
item: Freewind
setTime: Mike
setTime: Jack
this is err
setTime: Freewind
eachSeries:
与series相似,但不是异步操作而是顺序执行,其中callback不能少,否则只执行一个
顺序执行不出错,有callback返回:
async.eachSeries(arr,function(item,callback){
console.log('item:',item.name);
setTimeout(function(){
console.log('setTime:',item.name);
callback(null); //这里的callback不能少,可以写成callback()
},item.delay);
},function(err){
console.log(err);
})
打印顺序打印:
item: Jack
setTime: Jack
item: Mike
setTime: Mike
item: Freewind
setTime: Freewind
null
顺执行时候没有callback:
async.eachSeries(arr,function(item,callback){
console.log('item:',item.name);
setTimeout(function(){
console.log('setTime:',item.name);
//callback(null,item.name); //这里的callback不能少
},item.delay);
},function(err){
console.log(err);
})
item: Jack
setTime: Jack
中途出错:
async.eachSeries(arr,function(item,callback){
console.log('item:',item.name);
setTimeout(function(){
console.log('setTime:',item.name);
if(item.name === 'Mike'){
callback('this is err');
}else{
callback()
}
},item.delay);
},function(err){
console.log(err);
})
item: Jack
setTime: Jack
item: Mike
setTime: Mike
this is er
是each和eachSeries的结合,顺序执行,同时在顺序中可以分批异步执行
async.eachLimit(arr,2,function(item,callback){
console.log('item:',item.name);
setTimeout(function(){
console.log('setTime:',item.name);
callback(); //如果没有callback,只执行第一批,就是Jack和Mike
},item.delay);
},function(err){
console.log(err)
})
item: Jack
item: Mike
setTime: Mike
item: Freewind
setTime: Jack
setTime: Freewind
null
并行执行多个函数,每个函数都是立即执行,传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。
如果某个函数出错,则立刻将err和已经执行完的函数的结果值传给parallel最终的callback
async.parallel([
function(cb){
console.log('a');
cb(null,'a');
},
function(cb){
console.log('b');
cb(null,'b');
},
function(cb){
console.log('c');
cb(null,'c');
}
],function(err,results){
console.log(err,results); //err为空,results ['a','b','c']
})
还会打印 ‘a' 'b' 'c' ,如果加上setTimeout,打印的顺序不一样,但是results的顺序还是一样的
中途出错:
async.parallel([
function(cb){
console.log('a');
setTimeout(function(){ //这里设置延时
cb(null,'a');
},100);
},
function(cb){
console.log('b');
cb('this is err','b');
},
function(cb){
console.log('c');
cb(null,'c');
}
],function(err,results){
console.log(err,results);
})
输出,出错之后会立刻返回已经执行完的数据,而且,没有执行完的会在results中占位,从打印来看,虽然返回了,后面的task还是执行了打印’c'
a
b
this is err [ , 'b' ]
c
json格式:
async.parallel({
a : function(cb){
cb(null,'a');
},
b : function(cb){
cb(null,'b')
}
},function(err,results){
console.log(err,results) //null { a: 'a', b: 'b' }
})
未完待续....