浅谈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.tmpl JQuery模板插件
Oct 10 Javascript
javascript标签在页面中的位置探讨
Apr 11 Javascript
jQuery使用ajaxSubmit()提交表单示例
Apr 04 Javascript
JS案例分享之金额小写转大写
May 15 Javascript
浅谈jQuery中height与width
Jul 06 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
Sep 21 Javascript
JS中Array数组学习总结
Jan 18 Javascript
jQuery弹出窗口简单实现代码
Mar 09 Javascript
jquery append与appendTo方法比较
May 24 jQuery
element-ui upload组件多文件上传的示例代码
Oct 17 Javascript
JAVA面试题 static关键字详解
Jul 16 Javascript
vue 子组件修改data或调用操作
Aug 07 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字符串函数学习之strstr()
2015/03/27 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
js中的this关键字详解
2013/09/25 Javascript
jquery中ajax函数执行顺序问题之如何设置同步
2014/02/28 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
JavaScript仿微博发布信息案例
2016/11/16 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
vue2.0全局组件之pdf详解
2017/06/26 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
pycharm设置注释颜色的方法
2018/05/23 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
详解解决jupyter不能使用pytorch的问题
2021/02/18 Python
PurCotton全棉时代官网:100%天然棉花生产的生活护理用品
2016/11/18 全球购物
环境卫生倡议书
2014/08/29 职场文书
作风建设年活动实施方案
2014/10/24 职场文书
综合素质自我评价评语
2015/03/06 职场文书
初中军训感言
2015/08/01 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
浅谈:电影《孔子》观后感(范文)
2019/10/14 职场文书
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android
Windows server 2016服务器基本设置
2022/08/14 Servers