async:流程控制器,控制异步回调,可以控制代码的执行顺序。本文主要描述如题所示的三种控制方式。
并行方式:适用于处理每一个流程,流程间没有依赖关系,最后汇总结果。中途某个流程出错就会退出。我们可以根据代码中输出的日志,来查看执行顺序。
// 定义一个对象 obj,并在函数中输出日志,查看结果
let obj = {
func1: (callback) => {
setTimeout(()=>{
console.log(">> this is func1 ...");
callback && callback(null, "1");
}, 200);
},
func2: (callback) => {
setTimeout(()=>{
console.log(">> this is func2 ...");
callback && callback(null, "2");
}, 100);
}
};
async.parallel(obj, (err, results) => {
console.log(">> parallel results -> ", results);
});
自定义方式:适用于复杂的逻辑,比如一部分需要串行,另一部分又要并行,其他部分又有依赖关系。
// 故意打乱代码前后顺序,验证可以控制执行顺序。
// 注意代码中有些是数组对象,有些是常规对象。
let obj = {
func3 : ["func2", (results, callback) => {
// func2执行完成后,才执行func3
console.log(">> this is func3 ... ");
callback && callback(null, "func3");
}],
func1 : (callback: Function) => {
console.log(">> this is func1 ...");
callback && callback(null, "log1", "log2");
},
func2 : (callback: Function) => {
console.log(">> this is func2 ...");
callback && callback(null, {"key": "value"});
},
func4 : ["func2", "func3", (results, callback) => {
// func2、func3执行完成后,才执行func4
console.log(">> this is func4 ...");
callback && callback(null, {"file": results.func3});
}],
};
async.auto(obj, (err, results) => {
// 返回最终执行结果
console.log(">> auto results -> ", results);
});
串行方式:是按顺序依次执行多个函数,每一个函数产生的值,都会传给下一个函数。如果某个函数出错,剩余部分不会被执行。
// 定义一个数组类型的对象 obj
let obj = [
//注释1
(callback) => {
// "param1"会传递给 “注释2”的函数。
callback(null, "param1");
},
// 注释2
(arg1, callback) => {
// arg1 的值就是“注释1”传递的值。
console.log(">> arg1 -> ", arg1);
// "param2", "param3"会传递给 “注释3”的函数
callback(null, "param2", "param3");
},
// 注释3
(arg1, arg2, callback) => {
// arg1、arg2 的值就是“注释2”传递的值。
console.log(">> arg1 -> ", arg1, " arg2 -> ", arg2);
callback(null, "done");
}
];
async.waterfall(obj, (err, results) => {
console.log(">> results -> ", results);
})