Control Flow (流程控制)
1. series
series(tasks, [callback]) - 按照顺序运行数组中的函数,每一个函数都将执行一次,结果返回到回调中
Template 1
async.series([
function(callback){
setTimeout(function(){
callback(null, 'one');
}, 200);
},
function(callback){
setTimeout(function(){
callback(null, 'two');
}, 100);
},
function(callback){
setTimeout(function(){
var err = new Error('I am the error');
callback(err);
}, 400);
},
function(callback){
setTimeout(function(){
callback(null, 'three');
}, 600);
}
],
// optional callback
function(err, results){
//results is now equal to [ 'one', 'two', undefined ]
if(err){
console.log('Error');
} else {
}
console.log(results);
});
Output 1
Error
[ 'one', 'two', undefined ]
2. parallel
parallel(tasks, [callback]) - 并行运行数组中的函数,每一个函数都将执行一次,结果返回到回调中
Template 2
async.parallel([
function(callback){
setTimeout(function(){
callback(null, 'one');
}, 200);
},
function(callback){
setTimeout(function(){
callback(null, 'two');
}, 100);
},
function(callback){
setTimeout(function(){
var err = new Error('I am the error');
callback(err);
}, 400);
},
function(callback){
setTimeout(function(){
callback(null, 'three');
}, 600);
},
],
// optional callback
function(err, results){
if(err){
console.log('Error');
} else {
}
console.log(results);
//results is now equal to [ 'one', 'two', undefined ]
// the second function had a shorter timeout.
});
Output 2
Error
[ 'one', 'two', undefined ]
看上的两个函数从结果来看是没有什么不同的,因为无论过程如何,返回的数组内数据都是按照函数的顺序排列的,简单总结如下
- series 的result产生的顺序是
[one]
->[one, two]
-> ... - parallel 的result产生的顺序是
[,two]
->[one, two]
-> ...
一般来讲,如果函数相互独立,应优先选用parallel来控制函数运行,因为其更加快速
series与parallel返回对象数据
// an example using an object instead of an array
async.series({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback){
setTimeout(function(){
callback(null, 2);
}, 100);
}
},
function(err, results) {
// results is now equal to: {one: 1, two: 2}
});
// an example using an object instead of an array
async.parallel({
one: function(callback){
setTimeout(function(){
callback(null, 1);
}, 200);
},
two: function(callback){
setTimeout(function(){
callback(null, 2);
}, 100);
}
},
function(err, results) {
// results is now equals to: {one: 1, two: 2}
});
类似于处理数组时并行计算的Limit限制,parallel也有个近似函数,可以设定limit参数
- parallelLimit(tasks, limit, [callback])
3. whilst
whilst(test, fn, callback) - 测试函数test返回的true,则执行fn函数,最后调用回调函数
Template 3
var count = 0;
async.whilst(
function () {
console.log(count);
return count < 5; },
function (callback) {
count++;
setTimeout(callback, 1000);
},
function (err) {
// 5 seconds have passed
}
);
Output 3
0
1
2
3
4
5
类似的控制函数还有doWhilst, until, doUntil, during, doDuring, forever 此处不一一举例
4. waterfall
waterfall(tasks, [callback]) - 任务数组中的函数会将本函数的结果传递给下一个函数,有错误产生则终止,并执行回调函数
Template 4
async.waterfall([
function(callback) {
callback(null, 'one', 'two');
},
function(arg1, arg2, callback) {
// arg1 now equals 'one' and arg2 now equals 'two'
callback(null, 'three');
},
function(arg1, callback) {
// arg1 now equals 'three'
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
});
最终的result数据将由最后一个函数拼接产生。
暂时先学这么多,以后有需要再看文档,Async官方文档地址:https://github.com/caolan/async