浅谈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 原型模式实现OOP的再研究
Apr 09 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
Apr 02 Javascript
jQuery EasyUI API 中文文档 - Panel面板
Sep 30 Javascript
Jquery中删除元素的实现代码
Dec 29 Javascript
javascript简单实现图片预加载
Dec 03 Javascript
在Mac OS下使用Node.js的简单教程
Jun 24 Javascript
javascript DIV实现跟随鼠标移动
Mar 19 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
Mar 13 Javascript
ES6 如何改变JS内置行为的代理与反射
Feb 11 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
Jun 09 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 Javascript
深入理解redux之compose的具体应用
Jan 12 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二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
php实现评论回复删除功能
2017/05/23 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
js导入导出excel(实例代码)
2013/11/25 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
JavaScript中的6种运算符总结
2014/10/16 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
2017/10/19 jQuery
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
vue-content-loader内容加载器的使用方法
2018/08/05 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
利用Python演示数型数据结构的教程
2015/04/03 Python
关于python写入文件自动换行的问题
2018/06/23 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
python全局变量引用与修改过程解析
2020/01/07 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
房产销售经理职责
2013/12/20 职场文书
小学一年级学生评语
2014/04/22 职场文书
培训通知书模板
2015/04/17 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
CSS3 天气图标动画效果
2021/04/06 HTML / CSS
Java设计模式之代理模式
2022/04/22 Java/Android