浅谈node.js中async异步编程


Posted in Javascript onOctober 22, 2015

1.什么是异步编程?

异步编程是指由于异步I/O等因素,无法同步获得执行结果时,
在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。

示例:

for (var i = 1; i <= 3; i++) {
setTimeout(function(){
console.log(i);
}, 0);
};

这里大部分人会认为输出123,或者333。其实它会输出 444

这里就是我们要说的异步编程了。

高级函数的定义

这里为什么会说到高级函数,因为高级函数是异步编程的基础。

那什么是高级函数呢?
其实高级函数就是把函数作为参数或者是作为返回值。

示例:

function test(v){
return function(){
return v;
}
}

如上就是把一个函数作为一个返回值。

2.流程控制

函数有:
series
waterfall
parallel
parallelLimit

series函数 串行执行

它的作用就是按照顺序一次执行。

async.series({
  one: function(callback){
    callback(null, 1);
  },
  two: function(callback){
    callback(null, 2);
  }
},function(err, results) {
  console.log(results);
});

输出:{one: 1, two: 2}

series函数的第一个参数可以是一个数组也可以是一个JSON对象,
参数类型不同,影响的是返回数据的格式。

waterfall函数 瀑布流

waterfall和series函数有很多相似之处,都是按照顺序执行。
不同之处是waterfall每个函数产生的值,都将传给下一个函数,而series则没有这个功能,示例如下:

async.waterfall([
  function(callback){
    callback(null, 'one', 'two');
  },
  function(arg1, arg2, callback){
   // arg1 now equals 'one' and arg2 now equals 'two'
    callback(null, 'three');
  },
  function(arg1, callback){
    // arg1 now equals 'three'
    callback(null, 'done');
  }
], function (err, result) {
  // result now equals 'done'
  console.log(result);
});

另外需要注意的是 waterfall 的 tasks 参数只能是数组类型。
当中途有函数出错,其err直接传给最终callback,结果被丢弃,后面的函数不再执行。

parallel(tasks, [callback])

parallel函数是并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。
传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序,示例如下:

async.parallel([
  function(callback){
    callback(null, 'one');
  },
  function(callback){
    callback(null, 'two');
  }
],
function(err, results){

});

tasks参数可以是一个数组或是json对象,和series函数一样,
tasks参数类型不同,返回的results格式会不一样。

parallelLimit(tasks, limit, [callback])

parallelLimit函数和parallel类似,但是它多了一个参数limit。
limit参数限制任务只能同时并发一定数量,而不是无限制并发,示例如下:

async.parallelLimit([
  function(callback){
    callback(null, 'one');
  },
  function(callback){
    callback(null, 'two');
  }
],

2,

function(err, results){
  console.log(results);
});
Javascript 相关文章推荐
从JavaScript的函数重名看其初始化方式
Mar 08 Javascript
js实现交换运动效果的方法
Apr 10 Javascript
微信JSSDK上传图片
Aug 23 Javascript
JavaScript生成二维码图片小结
Dec 27 Javascript
Vue.js教程之计算属性
Nov 11 Javascript
AngularJS过滤器filter用法总结
Dec 13 Javascript
JS实现复选框的全选和批量删除功能
Apr 05 Javascript
在使用JSON格式处理数据时应该注意的问题小结
May 20 Javascript
Angularjs自定义指令Directive详解
May 27 Javascript
用Webpack构建Vue项目的实践
Nov 07 Javascript
vue实现学生录入系统之添加删除功能
Jul 11 Javascript
Vuex的各个模块封装的实现
Jun 05 Javascript
JS实现不使用图片仿Windows右键菜单效果代码
Oct 22 #Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
Oct 22 #Javascript
JS+CSS实现大气清新的滑动菜单效果代码
Oct 22 #Javascript
Webpack 实现 Node.js 代码热替换
Oct 22 #Javascript
JS+CSS实现仿msn风格选项卡效果代码
Oct 22 #Javascript
Node.js巧妙实现Web应用代码热更新
Oct 22 #Javascript
深入剖析JavaScript编程中的对象概念
Oct 21 #Javascript
You might like
PHP脚本的10个技巧(1)
2006/10/09 PHP
[原创]效率较高的php下读取文本文件的代码
2008/07/02 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
JavaScript:Date类型全面解析
2016/05/19 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
python去掉行尾的换行符方法
2017/01/04 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
python numpy格式化打印的实例
2018/05/14 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
python操作excel让工作自动化
2019/08/09 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
使用python实现回文数的四种方法小结
2019/11/24 Python
python随机数分布random均匀分布实例
2019/11/27 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
2020/05/21 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
意大利和国际奢侈品牌购物网站:Suitnegozi.com
2021/01/15 全球购物
高级技校毕业生自荐信
2013/11/18 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL