浅谈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 相关文章推荐
收藏一些不常用,但是有用的代码
Mar 12 Javascript
Fullpage.js固定导航栏-实现定位导航栏
Mar 17 Javascript
Javascript的无new构建实例详解
May 15 Javascript
JS函数修改html的元素内容,及修改属性内容的方法
Oct 28 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
Dec 14 Javascript
vue双向绑定的简单实现
Dec 22 Javascript
Angular.js去除页面中显示的空行方法示例
Mar 30 Javascript
fullPage.js和CSS3实现全屏滚动效果
May 05 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
Oct 23 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
Sep 02 Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 Javascript
js实现简易ATM功能
Oct 27 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
多数据表共用一个页的新闻发布
2006/10/09 PHP
留言板翻页的实现详解
2006/10/09 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
2016/04/11 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
CSS和Javascript简单复习资料
2010/06/29 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
影响jQuery使用的14个方面
2014/09/01 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
2017/01/20 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
Python3读取zip文件信息的方法
2015/05/22 Python
举例讲解Python中的迭代器、生成器与列表解析用法
2016/03/20 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Python通过kerberos安全认证操作kafka方式
2020/06/06 Python
详解Python 函数参数的拆解
2020/09/02 Python
史上最详细的Python打包成exe文件教程
2021/01/17 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
戴尔美国官网:Dell
2016/08/31 全球购物
简历自我评价怎么写呢?
2014/01/06 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
Python实现单例模式的5种方法
2021/06/15 Python
Windows server 2012 配置Telnet以及用法详解
2022/04/28 Servers