浅谈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 相关文章推荐
解决表单中第一个非隐藏的元素获得焦点的一个方案
Oct 26 Javascript
跟着JQuery API学Jquery 之三 筛选
Apr 09 Javascript
javascript正则匹配汉字、数字、字母、下划线
Apr 10 Javascript
删除Javascript Object中间的key
Nov 18 Javascript
非常漂亮的相册集 使用jquery制作相册集
Apr 28 Javascript
Bootstrap基本插件学习笔记之按钮(21)
Dec 08 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
Mar 03 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
May 22 Javascript
JavaScript多种页面刷新方法小结
Apr 04 Javascript
关于Vue源码vm.$watch()内部原理详解
Apr 26 Javascript
Vue 递归多级菜单的实例代码
May 05 Javascript
vue 解除鼠标的监听事件的方法
Nov 13 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比较多维数组中值的大小排序实现代码
2012/09/08 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
Laravel 读取 config 下的数据方法
2019/10/13 PHP
js select常用操作控制代码
2010/03/16 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
全面解析多种Bootstrap图片轮播效果
2016/05/27 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
原生JS实现小小的音乐播放器
2017/10/16 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
js实现日历
2020/11/07 Javascript
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
Linux下Python安装完成后使用pip命令的详细教程
2018/11/22 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
通过python检测字符串的字母
2020/02/18 Python
3种适用于Python的疯狂秘密武器及原因解析
2020/04/29 Python
CSS3圆角边框和边界图片效果实例
2016/07/01 HTML / CSS
微型企业创业投资计划书
2014/01/10 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
小学运动会宣传稿
2015/07/23 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
创业计划书之孕婴生活馆
2019/11/11 职场文书