async.parallel async.auto 和 async.waterfall

简介

async:流程控制器,控制异步回调,可以控制代码的执行顺序。本文主要描述如题所示的三种控制方式。

一、async.parallel

并行方式:适用于处理每一个流程,流程间没有依赖关系,最后汇总结果。中途某个流程出错就会退出。我们可以根据代码中输出的日志,来查看执行顺序。

// 定义一个对象 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);
});

二、async.auto

自定义方式:适用于复杂的逻辑,比如一部分需要串行,另一部分又要并行,其他部分又有依赖关系。

// 故意打乱代码前后顺序,验证可以控制执行顺序。
// 注意代码中有些是数组对象,有些是常规对象。
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);
});

三、async.waterfall

串行方式:是按顺序依次执行多个函数,每一个函数产生的值,都会传给下一个函数。如果某个函数出错,剩余部分不会被执行。

// 定义一个数组类型的对象 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);
})

猜你喜欢

转载自blog.csdn.net/HYNN12/article/details/109548001