浅谈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 相关文章推荐
Prototype使用指南之hash.js
Jan 10 Javascript
Ajax执行顺序流程及回调问题分析
Dec 10 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
Nov 14 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
Aug 25 Javascript
ES6实现的遍历目录函数示例
Apr 07 Javascript
layui框架中layer父子页面交互的方法分析
Nov 15 Javascript
详解AngularJS 过滤器的使用
Jun 02 Javascript
angular 组件通信的几种实现方式
Jul 13 Javascript
vue2.0获取鼠标位置的方法
Sep 13 Javascript
用JS实现选项卡
Mar 23 Javascript
Vue使用Three.js加载glTF模型的方法详解
Jun 14 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
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
一些PHP写的小东西
2006/12/06 PHP
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
简单的php写入数据库类代码分享
2011/07/26 PHP
php实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
PHP回调函数简单用法示例
2019/05/08 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
Google官方支持的NodeJS访问API,提供后台登录授权
2014/07/29 NodeJs
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
浅谈js常用内置方法和对象
2016/09/24 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
原生Javascript插件开发实践
2017/01/18 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
js 毫秒转天时分秒的实例
2017/11/17 Javascript
Vue侦测相关api的实现方法
2019/05/22 Javascript
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
Python循环中else,break和continue的用法实例详解
2019/07/11 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
基于Python解密仿射密码
2019/10/21 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
产品促销活动策划书
2014/01/15 职场文书
幼儿运动会邀请函
2014/01/17 职场文书
商业活动邀请函
2014/02/04 职场文书
主管会计岗位责任制
2014/02/10 职场文书
联谊活动总结
2014/08/28 职场文书
公司的门卫岗位职责
2014/09/09 职场文书
九华山导游词
2015/02/03 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
2015年导购员工作总结
2015/04/25 职场文书
学术研讨会主持词
2015/07/04 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android