前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nodejs之async模块

nodejs之async模块

作者头像
OECOM
发布2020-07-01 17:24:23
9110
发布2020-07-01 17:24:23
举报
文章被收录于专栏:OECOM

async模块是为了解决嵌套金字塔,和异步流程控制而生,常用方法有series、parallel、waterfall、parallelLimit、auto、whilst、doWhilst、forever和compose,下面分别对这几种方式进行介绍

series

多个函数从上到下依次执行,相互之间没有数据交互,调用方法为series(task,[callback])

代码语言:javascript
复制
var task1 = function(callback){
		console.log("task1");
		callback(null,'task1')
	}
	var task2 = function(callback){
		console.log("task2");
		setTimeout(()=>{
			callback(null,'task2')
		},5000)
		
	}
	var task3 = function(callback){
		console.log("task3");
		callback(null,'task3')
	}
	async.series([task1,task2,task3],function(err,result){
		console.log('series');
		if(err){
			console.log(err);
		}
		console.log(result);
	})

输出结果为

nodejs之async模块
nodejs之async模块

如果中途发生错误,则将错误传递到回调函数,并停止执行后面的函数

代码语言:javascript
复制
var task1 = function(callback){
		console.log("task1");
		callback(null,'task1')
	}
	var task2 = function(callback){
		console.log("task2");
		setTimeout(()=>{
			callback('err','task2')
		},5000)
		
	}
	var task3 = function(callback){
		console.log("task3");
		callback(null,'task3')
	}
	async.series([task1,task2,task3],function(err,result){
		console.log('series');
		if(err){
			console.log(err);
		}
		console.log(result);
	})

输出结果为

nodejs之async模块
nodejs之async模块

parallel

多个函数并行执行,不会等待其他函数,调用方式parallel(tasks,[callback])

代码语言:javascript
复制
var task1 = function(callback){
		console.log("task1");
		setTimeout(()=>{
			callback(null,'task1')
		},4000)
	}
	var task2 = function(callback){
		console.log("task2");
		setTimeout(()=>{
			callback(null,'task2')
		},5000)
		
	}
	var task3 = function(callback){
		console.log("task3");
		setTimeout(()=>{
			callback(null,'task23')
		},2000)
	}
	console.time("parallel方法");
	async.parallel([task1,task2,task3],function(err,result){
		console.log('parallel');
		if(err){
			console.log(err);
		}
		console.timeEnd("parallel方法");
		console.log(result);
	})

输出结果为:

nodejs之async模块
nodejs之async模块

如果中途出错,则立即将err和值传到最终的回调函数,其他未执行完毕的函数将不再执行,但是要占一个位置

也就是说如果第二个方法抛出错误,则返回的数组为['task1','task3']

waterfall

依次执行,前一个函数的输出为后一个函数的输入,这是使用最多的一个方法,解决多个异步嵌套很是方便。具体调用方式为:waterfall(tasks,[callback])

代码语言:javascript
复制
var task1 = function(callback){
		console.log("task1");
		callback(null,'11')
	}
	var task2 = function(params,callback){
		console.log("1传递过来的参数:"+params);
		setTimeout(()=>{
			callback(null,'22')
		},5000)
		
	}
	var task3 = function(params,callback){
		console.log("task3");
		console.log("2传递过来的参数:"+params);
		setTimeout(()=>{
			callback(null,'33')
		},2000)
	}
	async.waterfall([task1,task2,task3],function(err,result){
		console.log('waterfall');
		if(err){
			console.log(err);
		}
		console.log(result);
	})

输出结果为

nodejs之async模块
nodejs之async模块

如果中途出现错误,后面的函数将不在执行,之前执行的结果和错误信息将直接传到最终的回调函数,在此不再赘述。

parallelLimit

这个方法和parallel类似,只是limit参数限制了同时并发执行的个数,不再是无限并发,调用方法为:parallelLimit(tasks,limit,[callback])

代码语言:javascript
复制
var task1 =function(callback){
 
		console.log("task1");
		setTimeout(function(){
			callback(null,"task1")
		},5000);
		
	}
 
	var task2 =function(callback){
 
		console.log("task2");
 
		setTimeout(function(){
			callback(null,"task2")
		},3000);
	}
 
	var task3 =function(callback){
 
		console.log("task3");
		setTimeout(function(){
			callback(null,"task3")
		},4000);
	}
	console.time("parallelLimit方法");
	async.parallelLimit([task1,task2,task3], 2, function(err,result){
 
		console.log("parallelLimit");
 
		if (err) {
			console.log(err);
		}
 
		console.log(result);
		console.timeEnd("parallelLimit方法");
	})

运行结果为

nodejs之async模块
nodejs之async模块

看到上面执行时间有的人会问了,为什么三个任务分别执行时间为5s,4s,3s,为何执行结果不是5s而是七秒呢,原因就在于并发上了,先执行了1和2两个任务,在4s的时候2任务执行完成,此时开始执行3任务,同时1任务还差1秒执行完成,如此总的时间就变成了7秒。

auto

多个函数有数据交互,有的并行,有的依次执行,调用方法:auto(tasks,[callback])

代码语言:javascript
复制
console.time("auto方法");
async.auto({
task1: function(callback){
console.log("tsak1");
setTimeout(function(){
callback(null, 'task11', 'task12');
},2000);
},
task2: function(callback){ 
console.log('task2');
setTimeout(function(){ 
callback(null, 'task2');
},3000);
},
task3: ['task1', 'task2', function(results,callback){
console.log('task3');
console.log('task1和task2运行结果: ',results);
setTimeout(function(){ 
callback(null, 'task3');
},1000);
}],
task4: ['task3', function(results,callback){
console.log('task4');
console.log('task1,task2,task3运行结果: ',results);
setTimeout(function(){
callback(null, {'task41':results.task3, 'task42':'task42'});
},1000);
}]
}, function(err, results) {
console.log('err :', err);
console.log('最终results : ', results);
console.timeEnd("auto方法");
});

运行结果为:

nodejs之async模块
nodejs之async模块

5秒运行完毕,

函数1和2并行,3秒执行完毕,

函数1和2执行完毕后,函数3,4依次执行共计5秒.

whilst

相当于while循环,fn函数里不管是同步还是异步都会执行完上一次循环才会执行下一次循环,对异步循环很有帮助,

test是条件,为true时执行fn里的方法

代码语言:javascript
复制
var datalist = [{number:10},{number:20},{number:30},{number:40},{number:50}];
	var count = 0;
 
	var test = function () {
		return count<datalist.length;
	};
 
	var fn = function(callback){
		console.log(datalist[count].number);
		setTimeout(function () {
			count++;
			callback();
		},1000)
	};
	
	async.whilst(test,fn,function(err){
		if(err){
			console.log(err);
		}
		console.log('whilst结束');
	});

doWhilst

和whilst类似,和do-while一个意思,首先执行一次fn,再判断,和whilst相比它把fn和test位置交换了而已.

until和whilst相反,当test判断为false的时候执行fn里的方法,为true时跳出,

doUntil与doWhilst相反.

forever

forever就是无限循环了.只有当中途出现错误的时候才会停止,调用方法forever(fn,errback)

代码语言:javascript
复制
var count = 0;
  async.forever(function(callback){
  	console.log(count);
  	count++;
 
  	if (count>10) {
  		callback("errmessage");
  		return;
  	}
 
  	setTimeout(function () {
  		callback();
  	},1000)
  },
  function(err){
  	console.log(err);
  });

compose

这个方法会创建一个异步的集合函数,执行的顺序是倒序.前一个fn的输出是后一个fn的输入.有数据交互,调用方法:compose(fn1,fn2,fn3...)

代码语言:javascript
复制
var task1 =function(m,callback){
 
		console.log("task1");
		setTimeout(function(){
			callback(null,m*2)
		},1000);
		
	}
 
	var task2 =function(m,callback){
 
		console.log("task2");
 
		setTimeout(function(){
			callback(null,m+3)
		},1000);
	}
 
	var task3 =function(m,callback){
 
		console.log("task3");
		setTimeout(function(){
			callback(null,m*5)
		},1000);
	}
	console.time("compose方法");
 
	var com = async.compose(task3,task2,task1);
 
	com(2,function(err,result){
		if (err) {
			console.log(err);
		}
		console.log(result);
		console.timeEnd("compose方法");
	})

运行结果

nodejs之async模块
nodejs之async模块

相当于 var m=2; (m*2+3)*5 =35;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • series
  • waterfall
  • parallelLimit
  • auto
  • whilst
  • doWhilst
  • forever
  • compose
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档