浅谈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之二(两种扩展)
Jun 11 Javascript
javascript的console.log()用法小结
May 31 Javascript
jQuery的remove()方法使用详解
Aug 11 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
微信小程序开发之map地图实现教程
Jun 08 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
Jun 19 Javascript
JS实现基于拖拽改变物体大小的方法
Jan 23 Javascript
vue+axios+element ui 实现全局loading加载示例
Sep 11 Javascript
JavaScript数据结构之栈实例用法
Jan 18 Javascript
详解JWT token心得与使用实例
Aug 02 Javascript
canvas 中如何实现物体的框选
Aug 05 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 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
PHP实现简单实用的分页类代码
2016/04/08 PHP
Javascript select下拉框操作常用方法
2009/11/09 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
关于js函数解释(包括内嵌,对象等)
2016/11/20 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
最大K个数问题的Python版解法总结
2016/06/16 Python
python 系统调用的实例详解
2017/07/11 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
Python和Go语言的区别总结
2019/02/20 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
2020/07/01 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
班主任经验交流会主持词
2014/04/01 职场文书
小学生作文评语大全
2014/04/21 职场文书
社区健康教育工作方案
2014/06/03 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers