浅谈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 相关文章推荐
初探jquery——表单应用范例
Feb 20 Javascript
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
Sep 25 Javascript
慎用 somefunction.prototype 分析
Jun 02 Javascript
jquery 使用点滴函数代码
May 20 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
Jan 04 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
Nov 02 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
May 30 Javascript
漂亮! js实现颜色渐变效果
Aug 12 Javascript
ES6正则表达式扩展笔记
Jul 25 Javascript
史上最为详细的javascript继承(推荐)
May 18 Javascript
Vue实现剪切板图片压缩功能
Feb 04 Javascript
vue 实现超长文本截取,悬浮框提示
Jul 29 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实现等比例压缩图片
2018/07/26 PHP
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
2017/01/05 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
2017/01/16 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python中处理时间的几种方法小结
2015/04/09 Python
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
python assert的用处示例详解
2019/04/01 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
python tkinter组件使用详解
2019/09/16 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
电子工程专业毕业生求职信
2014/03/14 职场文书
拉拉队口号
2014/06/16 职场文书
会计人员演讲稿
2014/09/11 职场文书
好媳妇事迹材料
2014/12/24 职场文书
门卫岗位职责
2015/02/09 职场文书
学校会议通知范文
2015/04/15 职场文书
人事任命通知书
2015/04/21 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
Mysql 用户权限管理实现
2021/05/25 MySQL
浅谈Python数学建模之固定费用问题
2021/06/23 Python