浅谈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 1.42 checkbox 全选和反选代码
Mar 27 Javascript
jQuery实现图片左右滚动特效
Apr 20 Javascript
TinyMCE汉化及本地上传图片功能实例详解
May 31 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
jQuery中的deferred使用方法
Mar 27 jQuery
webpack构建换肤功能的思路详解
Nov 27 Javascript
Vue实现导出excel表格功能
Mar 30 Javascript
详解在React中跨组件分发状态的三种方法
Aug 09 Javascript
原生js实现淘宝放大镜效果
Oct 28 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
Jan 24 Javascript
基于vue通用表单解决方案的思考与分析
Mar 16 Javascript
基于javascript处理nginx请求过程详解
Jul 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
CentOS 6.3下安装PHP xcache扩展模块笔记
2014/09/10 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
ES7之Async/await的使用详解
2019/03/28 Javascript
python中zip()方法应用实例分析
2016/04/16 Python
python matplotlib画图实例代码分享
2017/12/27 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
Python实现像awk一样分割字符串
2020/09/15 Python
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
运动会开幕式邀请函
2014/01/22 职场文书
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
请假条的格式
2014/04/11 职场文书
公司合作意向书范文
2014/07/30 职场文书
旅行社优秀创业计划书
2014/08/16 职场文书
一份关于丢失公司财物的检讨书
2014/09/19 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
上课说话检讨书
2015/01/27 职场文书
外出考察学习心得体会
2016/01/18 职场文书
财务年终工作总结大全
2019/06/20 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
详解python的内存分配机制
2021/05/10 Python