深入学习nodejs中的async模块的使用方法


Posted in NodeJs onJuly 12, 2017

最近在学习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); 
})

运行结果:

深入学习nodejs中的async模块的使用方法

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

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); 
})

运行结果:

深入学习nodejs中的async模块的使用方法

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方法"); 
})

运行结果:

深入学习nodejs中的async模块的使用方法

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方法"); 
})

运行结果:

深入学习nodejs中的async模块的使用方法

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方法"); 
})

执行结果:

深入学习nodejs中的async模块的使用方法 

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

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方法"); 
})

运行结果:

深入学习nodejs中的async模块的使用方法

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方法"); 
})

运行结果:

深入学习nodejs中的async模块的使用方法

三个函数分别是延迟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方法"); 
});

运行结果:

深入学习nodejs中的async模块的使用方法

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结束'); 
});

运行结果:

深入学习nodejs中的async模块的使用方法

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); 
});

运行结果:

深入学习nodejs中的async模块的使用方法

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方法"); 
})

运行结果:

深入学习nodejs中的async模块的使用方法

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

在我的项目开发中waterfall用的最多.

更多方法详情 : https://www.npmjs.com/package/async

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
nodejs基础知识
Feb 03 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
nodejs集成sqlite使用示例
Jun 05 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 #NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 #NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 #NodeJs
Nodejs之TCP服务端与客户端聊天程序详解
Jul 07 #NodeJs
Nodejs之http的表单提交
Jul 07 #NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 #NodeJs
nodejs模块学习之connect解析
Jul 05 #NodeJs
You might like
PHP 查找字符串常用函数介绍
2012/06/07 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
VUEJS实战之构建基础并渲染出列表(1)
2016/06/13 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
浅析javascript中的Event事件
2016/12/09 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
[10:34]DOTA2上海特级锦标赛全纪录
2016/03/25 DOTA
python实现360的字符显示界面
2014/02/21 Python
Python常用正则表达式符号浅析
2014/08/13 Python
python中执行shell命令的几个方法小结
2014/09/18 Python
用Python写冒泡排序代码
2016/04/12 Python
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
python中的print()输出
2019/04/12 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/04/11 面试题
妇科医生自荐信
2013/11/05 职场文书
生日庆典策划方案
2014/06/02 职场文书
文化大革命观后感
2015/06/17 职场文书
六年级数学教学反思
2016/02/16 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python