浅谈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 相关文章推荐
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
Aug 09 Javascript
js 页面刷新location.reload和location.replace的区别小结
Dec 24 Javascript
jquery中的查找parents与closest方法之间的区别
Dec 02 Javascript
浅谈JavaScript数据类型
Mar 03 Javascript
JavaScript中exec函数用法实例分析
Jun 08 Javascript
JS动态创建DOM元素的方法
Jun 09 Javascript
vue.js与后台数据交互的实例讲解
Aug 08 Javascript
js时间转换毫秒的实例代码
Aug 21 Javascript
vue源码中的检测方法的实现
Sep 26 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
Dec 23 jQuery
vue中改变滚动条样式的方法
Mar 03 Javascript
微信小程序实现聊天室功能
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
PHP脚本的10个技巧(1)
2006/10/09 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
Java中final关键字详解
2015/08/10 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
Python完全新手教程
2007/02/08 Python
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
python使用turtle绘制分形树
2018/06/22 Python
Python 二叉树的层序建立与三种遍历实现详解
2019/07/29 Python
在pycharm中显示python画的图方法
2019/08/31 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
《临死前的严监生》教学反思
2014/02/13 职场文书
环境科学专业求职信
2014/08/04 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
信息技术国培研修日志
2015/11/13 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
python神经网络Xception模型
2022/05/06 Python