1.为了解决node.js在实际项目中的异步特性,跳出回调大坑。
2.优雅的维护自己的代码。
3.更好的对自己的代码进行流程控制。
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'
});
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]
1.这2个方法感觉用法是一致的
2.async.map(task,callback,function(err,res){});
task是可以是数组或一个对象,类似与在for循环里面执行闭包操作。都是同时执行多条异步操作
1.都是按顺序执行操作
2.用法与map,each 一致。
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不仅可以用于数据库操作,其他异步操作也适用,比如文件读写等。