在读源码的过程中,看到有关 async 的代码有很多,本来是问老师,想逃避这里。然而给老师给了一个思路,让理解 async 的 series 函数、waterfall 函数、以及 parallel 函数。于是就有了这篇文章。
async 适用的业务逻辑:连续对数据库操作,前后有依赖
1. 什么是异步编程
异步编程是指由于异步 I/O 等因素,无法同步获得执行结果时,在回调函数中进行下一步操作的代码编写风格,常见的eg: setTimeout 函数、ajax 请求等。
例:
for (var i = 1; i <= 3; i++) {
setTimeout(function(){
console.log(i);
}, 0);
};
对于上述代码,可能大部分人会认为输出 123 或者 333。但正确结果是444
以上就是我们要说的异步编程。
在 javaScript 中,异步编程 的基础就是高阶函数。所谓高阶函数,其实就是把函数作为参数或者作为返回值。
例(将函数作为返回值):
function test(v){
return function(){
return v;
}
}
2. 流程控制
与流程控制有关的函数有很多,在此,我只简要说说 series、waterfall、parallel。
- series —— 串行执行,即按顺序一次执行
async.series({
one: function(callback){
callback(null, 1);
},
two: function(callback){
callback(null, 2);
}
},function(err, results) {
console.log(results);
});
输出:{one: 1, two: 2}
series 函数的第一个参数可以是一个数组,也可是一个 JSON 对象,参数类型不同,影响的是返回数据的格式。
- waterfall ——瀑布流
waterfall 和 series 有很多相似之处,都是按顺序执行。不同之处在于waterfall 每个函数产生的值,都将传给下一个函数,而 series 则没有这个功能
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'
console.log(result);
});
*waterfall 的第一个参数只能是数组类型。当中途有函数出错,其 err 将直接传给最终 callback,结果被丢弃,后面函数不再执行。
- parallel(tasks, [callback])
并行执行多个函数,每个函数都是立即执行,不需要等待其他函数先执行。传给最终 callback 的数组中的数据按照 tasks 中声明的顺序,而不是执行完成的顺序
例:
async.parallel([
function(callback){
callback(null, 'one');
},
function(callback){
callback(null, 'two');
}
],
function(err, results){
});
tasks 参数可以是一个数组或 JSON 对象,和 series 函数一样,tasks 参数类型不同,返回的results 格式会不一样