最近在学习nodejs,这两天学习了async模块这个地方知识点挺多的,所以,今天添加一点小笔记。

async模块是为了解决嵌套金字塔,和异步流程控制而生.常用的方法介绍
npm 安装好async模块,然后引入就可以使用 var async = require('async');
1. series(tasks,[callback])
多个函数从上到下依次执行,相互之间没有数据交互
var task1 =function(callback){
console.log("task1");
callback(null,"task1")
}
var task2 =function(callback){
console.log("task2");
callback(null,"task2")
}
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);
})
运行结果:
如果中途发生错误,则将错误传递到回调函数,并停止执行后面的函数
var task1 =function(callback){
console.log("task1");
callback(null,"task1")
}
var task2 =function(callback){
console.log("task2");
callback("err","task2")
}
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);
})
运行结果:
2.parallel(tasks,[callback])
多个函数并行执行,不会等待其他函数
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")
},1000);
}
var task3 =function(callback){
console.log("task3");
setTimeout(function(){
callback(null,"task3")
},3000);
}
console.time("parallel方法");
async.parallel([task1,task2,task3],function(err,result){
console.log("parallel");
if (err) {
console.log(err);
}
console.log(result);
console.timeEnd("parallel方法");
})
运行结果:
3个函数分别延迟5000ms,1000ms,3000ms 结果5000ms就执行完毕.
如果中途出错,则立即将err和值传到最终的回调函数,其他未执行完毕的函数将不再执行,但是要占一个位置
var task1 =function(callback){
console.log("task1");
setTimeout(function(){
callback(null,"task1")
},5000);
}
var task2 =function(callback){
console.log("task2");
setTimeout(function(){
callback("errmessage","task2")
},3000);
}
var task3 =function(callback){
console.log("task3");
setTimeout(function(){
callback(null,"task3")
},1000);
}
console.time("parallel方法");
async.parallel([task1,task2,task3],function(err,result){
console.log("parallel");
if (err) {
console.log(err);
}
console.log(result);
console.timeEnd("parallel方法");
})
运行结果:
3.waterfall(tasks,[callback]) :瀑布流
依次执行,前一个函数的输出为后一个函数的输入
var task1 =function(callback){
console.log("task1");
callback(null,"11")
}
var task2 =function(q,callback){
console.log("task2");
console.log("task1函数传入的值: "+q);
callback(null,"22")
}
var task3 =function(q,callback){
console.log("task3");
console.log("task2函数传入的值: "+q);
callback(null,"33")
}
console.time("waterfall方法");
async.waterfall([task1,task2,task3],function(err,result){
console.log("waterfall");
if (err) {
console.log(err);
}
console.log("result : "+result);
console.timeEnd("waterfall方法");
})
执行结果:
如果中途出现错误,后面的函数将不在执行,之前执行的结果和错误信息将直接传到最终的回调函数
var task1 =function(callback){
console.log("task1");
callback(null,"11")
}
var task2 =function(q,callback){
console.log("task2");
console.log("task1函数传入的值: "+q);
callback("errmessage","22")
}
var task3 =function(q,callback){
console.log("task3");
console.log("task2函数传入的值: "+q);
callback(null,"33")
}
console.time("waterfall方法");
async.waterfall([task1,task2,task3],function(err,result){
console.log("waterfall");
if (err) {
console.log(err);
}
console.log("result : "+result);
console.timeEnd("waterfall方法");
})
运行结果:
4.parallelLimit(tasks,limit,[callback])
和parallel类似,只是limit参数限制了同时并发执行的个数,不再是无限并发
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方法");
})
运行结果:
三个函数分别是延迟5000ms,3000ms,4000ms结果执行时间为什么是7000ms呢
因为首先执行函数1和2,
3秒后函数2执行完毕,这个时候函数3开始执行,
5秒后函数1执行完毕,函数3还有2秒,
7秒后函数3执行完毕.
5.auto(tasks,[callback])
多个函数有数据交互,有的并行,有的依次执行
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(callback, results){
console.log('task3');
console.log('task1和task2运行结果: ',results);
setTimeout(function(){
callback(null, 'task3');
},1000);
}],
task4: ['task3', function(callback, results){
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方法");
});
运行结果:
5秒运行完毕,
函数1和2并行,3秒执行完毕,
函数1和2执行完毕后,函数3,4依次执行共计5秒.
6.whilst(test,fn,[callback])
相当于while循环,fn函数里不管是同步还是异步都会执行完上一次循环才会执行下一次循环,对异步循环很有帮助,
test是条件,为true时执行fn里的方法
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结束');
});
运行结果:
7.doWhilst
和whilst类似,和do-while一个意思,首先执行一次fn,再判断,和whilst相比它把fn和test位置交换了而已.
until和whilst相反,当test判断为false的时候执行fn里的方法,为true时跳出,
doUntil与doWhilst相反.
8.forever(fn,errback)
forever就是无限循环了.只有当中途出现错误的时候才会停止
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);
});
运行结果:
9.compose(fn1,fn2,fn3...)
这个方法会创建一个异步的集合函数,执行的顺序是倒序.前一个fn的输出是后一个fn的输入.有数据交互
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方法");
})
运行结果:
相当于 var m=2; (m*2+3)*5 =35;
在我的项目开发中waterfall用的最多.
更多方法详情 : https://www.npmjs.com/package/async
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# nodejs
# async模块
# nodejs的async
# nodejs URL模块操作URL相关方法介绍
# Nodejs使用mysql模块之获得更新和删除影响的行数的方法
# nodejs使用http模块发送get与post请求的方法示例
# nodejs基于WS模块实现WebSocket聊天功能的方法
# Nodejs调用Dll模块的方法
# nodejs 日志模块winston的使用方法
# nodejs 使用 js 模块的方法实例详解
# NodeJs 文件系统操作模块fs使用方法详解
# nodejs中方法和模块用法示例
# 多个
# 中途
# 回调
# 才会
# 出现错误
# 一个函数
# 最多
# 很有
# 执行时间
# 换了
# 相互之间
# 这个时候
# 这两天
# 错误信息
# 而生
# 创建一个
# 大家多多
# 发生错误
# 装好
# 则将
相关文章:
,在苏州找工作,上哪个网站比较好?
网站制作网站,深圳做网站哪家比较好?
如何在阿里云域名上完成建站全流程?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何打造高效商业网站?建站目的决定转化率
建站之星后台密码遗忘或太弱?如何重置与强化?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
如何快速生成可下载的建站源码工具?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
广州商城建站系统开发成本与周期如何控制?
如何实现建站之星域名转发设置?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
建站主机如何选?性能与价格怎样平衡?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
香港服务器网站卡顿?如何解决网络延迟与负载问题?
山东云建站价格为何差异显著?
Python文件管理规范_工程实践说明【指导】
C++如何编写函数模板?(泛型编程入门)
公司网站制作需要多少钱,找人做公司网站需要多少钱?
ppt制作免费网站有哪些,ppt模板免费下载网站?
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
如何通过虚拟主机空间快速建站?
如何制作网站标识牌,动态网站如何制作(教程)?
建站之星免费版是否永久可用?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
股票网站制作软件,网上股票怎么开户?
如何快速辨别茅台真假?关键步骤解析
建站之星如何保障用户数据免受黑客入侵?
开封网站制作公司,网络用语开封是什么意思?
PHP 500报错的快速解决方法
已有域名如何快速搭建专属网站?
如何快速完成中国万网建站详细流程?
如何快速配置高效服务器建站软件?
寿县云建站:智能SEO优化与多行业模板快速上线指南
nginx修改上传文件大小限制的方法
建站之星多图banner生成与模板自定义指南
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
定制建站流程步骤详解:一站式方案设计与开发指南
北京制作网站的公司,北京铁路集团官方网站?
网站制作新手教程,新手建设一个网站需要注意些什么?
建站上市公司网站建设方案与SEO优化服务定制指南
建站之星如何实现五合一智能建站与营销推广?
淘宝制作网站有哪些,淘宝网官网主页?
如何通过VPS建站无需域名直接访问?
建站VPS选购需注意哪些关键参数?
*请认真填写需求信息,我们会在24小时内与您取得联系。