async 异步编程的应用
1.为了解决node.js在实际项目中的异步特性,跳出回调大坑。
2.优雅的维护自己的代码。
3.更好的对自己的代码进行流程控制。
async.waterfall
1.async.waterfall(array,function(err,res){})。
array是函数组成的数组,callback(function)是中途出错或者全部执行完后的回调函数。它的特点是串行执行函数,并且前一个函数的结果会传给下一个函数。示例:
async.waterfall([ function(callback){ callback(null, 'one', 'two'); }, function(arg1, arg2, callback){ callback(null, 'three'); }, function(arg1, callback){ // arg1 now equals 'three' callback(null, 'done'); } ], function (err, result) { // result now equals 'done' });
async.series
1.ayync.series(array or obj,function(err,res){}).
第一个传参可以是数组或者对象,callback返回执行的结果集,属于串行执行,即按顺序执行传入的function代码。与waterfall的区别在于后者能传参到下一个function进行逻辑操作。不过我们可已通过对变量的赋值达到waterfall同样的效果。
let data = [];
data.push(function(callback){callback(null,1);
})
data.push(function(callback){//启用定时器,模拟异步操作setTimeout(function(){callback(null,2);},2000)});
data.push(function(callback){callback(null,3);});async.series(data,function(err,row){console.log(row);
});// 输出结果 与预期正常:[1,2,3]
async.map and async.each
1.这2个方法感觉用法是一致的
2.async.map(task,callback,function(err,res){});
task是可以是数组或一个对象,类似与在for循环里面执行闭包操作。都是同时执行多条异步操作
async.mapSeries and async.eachSeries
1.都是按顺序执行操作
2.用法与map,each 一致。
async.auto
1.很多时候,你逻辑里面,既有waterfull的也有parallel的,那个就要写至少2个async函数调用,复杂的情况下,可能更多,但是async.auto的强大是在于,你定义好相互之间的dependencies,他来帮你决定用parallel还是waterfull。
2.async.auto(ojb);
看一个例子:
async.auto({
func1: function (callback, results) {
callback(null, “abc”, “bbc”);
},
func2: function (callback, results) {
console.log("Print#1:\n" + util.inspect(results));
callback(null, { "puncha": "during" });
},
func3: ["func2", function (callback, results) {
console.log("Print#2:\n" + util.inspect(results));
callback(null, 3);
}],
func4: ["func1", "func3", function (callback, results) {
console.log("Print#3:\n" + util.inspect(results));
callback(null);
}]
});
func1和func2可以并行执行,func3可以和func1并行但是需要等待func2,func4最后执行
结尾
1.以上用法是async比较常用的方法,用上他的话就可以不用担心异步回调大坑了,async不仅可以用于数据库操作,其他异步操作也适用,比如文件读写等。