async.auto
它适合逻辑复杂的代码,代码中你一部分需要串行,两部分相互依赖,一部分又需要并行,代码中不需要依赖,这个时候你就可以通过auto随性所欲控制你的代码逻辑。
//auto 适合复杂逻辑,需要Parallel又需要waterfull
async.auto({
//func1、func2是并行执行
func1: function (callback) {
console.log('in func1');
callback(null, 'data', 'converted to array');
},
func2: function (callback) {
console.log('in func2');
callback(null, { "puncha": "during" });
},
func3: ["func2", function (results, callback) {
//func2执行完后才执行func3
console.log('in func3', JSON.stringify(results));
callback(null, '3');
}],
func4: ["func1", "func3", function (results, callback) {
//func1,func3执行完后才执行func4
console.log('in func4', JSON.stringify(results));
callback(null, {'file':results.func3, 'email':'user@example.com'});
}]
}, function (err, results) {
//最后返回func1、2、3、4结果
console.log('err = ', err);
console.log('results = ', results);
});
func1、func2是并行执行相互独立,没有依赖;
func3依赖func2;
func4依赖func1、func3;
results 是 callback回调函数的结果。如果换成waterfall和parallel,
async.parallel([
func1,
func2,
async.waterfall([
func3,
async.waterfall([
func4
]),
]),
], func4)
async.waterfall、async.series 串行
async.waterfall
按顺序依次执行多个函数。每一个函数产生的值,都将传给下一个函数。如果中途出错,后面的函数将不会被执行。错误信息以及之前产生的结果,将传给waterfall最终的callback
async.waterfall([
function (callback) {
callback(null, 'one', 'two');
},
function (arg1, arg2, callback) {
// 上面的 arg1就是'one' arg2 就是 'two'
callback(null, 'three');
},
function (arg1, callback) {
// arg1就是'three'
callback(null, 'done');
}
], function (err, result) {
///最后得到所有
});
// 也可以定义方法:
async.waterfall([
myFirstFunction,
mySecondFunction,
myLastFunction,
], function (err, result) {
});
function myFirstFunction(callback) {
callback(null, 'one', 'two');
}
function mySecondFunction(arg1, arg2, callback) {
callback(null, 'three');
}
function myLastFunction(arg1, callback) {
callback(null, 'done');
}
async.series
按顺序依次执行多个函数。前后无依赖。如果中途出错,后面的函数将不会被执行。错误信息以及之前产生的结果,将传给waterfall最终的callback
async.series([
function(callback) {
callback(null, 'one');
},
function(callback) {
callback(null, 'two');
}
],
function(err, results) {
//最后结果
});
async.series({
one: function(callback) {
setTimeout(function() {
callback(null, 1);
}, 200);
},
two: function(callback){
setTimeout(function() {
callback(null, 2);
}, 100);
}
}, function(err, results) {
//最后结果
});
async.parallel
parallel 的原理是同时并行处理每一个流程,最后汇总结果,如果某一个流程出错就退出.他们之间是并行无依赖
async.parallel([
//并行同时执行
function(callback) {
setTimeout(function() {
callback(null, 'one');
}, 200);
},
function(callback) {
setTimeout(function() {
callback(null, 'two');
}, 100);
}
],
function(err, results) {
//等上面两个执行完返回结果
});
async.parallel({
one: function(callback) {
setTimeout(function() {
callback(null, 1);
}, 200);
},
two: function(callback) {
setTimeout(function() {
callback(null, 2);
}, 100);
}
}, function(err, results) {
});
集合操作
当你有一个集合,你想循环集合,然后对每个集合按照顺序执行相应的方法你可以使用forEachSeries
var arr = [{name:'Jack', delay: 200},
{name:'Mike', delay: 100},
{name:'Freewind', delay: 300}];
async.forEachSeries(arr, function(item, callback) {
setTimeout(function(){
callback();
}, item.delay);
}, function(err) {
});
下面是并行
也就是每2个并行,然后这两个就是串行执行
async.forEachLimit(arr, 2, function(item, callback) {
log(’1.5 enter: ‘ + item.name);
setTimeout(function(){
log(’1.5 handle: ‘ + item.name);
callback(null, item.name);
}, item.delay);
}, function(err) {
log(’1.5 err: ‘ + err);
});
网友评论