浅谈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 validate使用攻略 第四步
Jul 01 Javascript
jQeury淡入淡出需要注意的问题
Sep 08 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
Mar 15 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
Apr 25 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
Dec 17 Javascript
js实现键盘控制DIV移动的方法
Jan 10 Javascript
javascript中的五种基本数据类型
Aug 26 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
May 26 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
Jan 14 Javascript
vue组件编写之todolist组件实例详解
Jan 22 Javascript
VUE-ElementUI 自定义Loading图操作
Nov 11 Javascript
react 项目中引入图片的几种方式
Jun 02 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
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
采用thinkphp自带方法生成静态html文件详解
2014/06/13 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
jquery 元素相对定位代码
2010/10/15 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
JavaScript函数节流概念与用法实例详解
2016/06/20 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
jQuery鼠标移动图片上实现放大效果
2017/06/25 jQuery
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
vue elementUI 表单校验功能之数组多层嵌套
2019/06/04 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
[02:00]最后,我终于出了辉耀
2018/03/27 DOTA
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
python实时监控cpu小工具
2018/06/21 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
金士达面试非笔试
2012/03/14 面试题
职称评定自我鉴定
2014/03/18 职场文书
公证委托书模板
2014/04/03 职场文书
开展创先争优活动总结
2014/08/28 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
导游词之镇江焦山
2019/11/21 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android