浅谈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 相关文章推荐
JS运行耗时操作的延时显示方法
Nov 19 Javascript
JS动态加载当前时间的方法
Feb 09 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
JavaScript设置表单上传时文件个数的方法
Aug 11 Javascript
学习JavaScript设计模式(继承)
Nov 26 Javascript
JavaScript必知必会(七)js对象继承
Jun 08 Javascript
jQuery使用正则表达式限制文本框只能输入数字
Jun 18 Javascript
浅谈node.js 命令行工具(cli)
May 10 Javascript
element ui table(表格)实现点击一行展开功能
Dec 04 Javascript
layui实现左侧菜单点击右侧内容区显示
Jul 26 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
Aug 27 Javascript
JS实现吸顶特效
Jan 08 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
rephactor 优秀的PHP的重构工具
2011/06/09 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
wampserver改变默认网站目录的办法
2015/08/05 PHP
详解WordPress中提醒安装插件以及隐藏插件的功能实现
2015/12/25 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
jquery 简单图片导航插件jquery.imgNav.js
2010/03/17 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
2015/07/18 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
haskell实现多线程服务器实例代码
2013/11/26 Python
python 查找字符串是否存在实例详解
2017/01/20 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
Python中创建二维数组
2018/10/17 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
中文系学生自荐信范文
2013/11/13 职场文书
结婚周年感言
2014/02/24 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
2015员工年度考核评语
2015/03/25 职场文书
就业意向书范本
2015/05/11 职场文书
事业单位岗位说明书
2015/10/08 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书