浅谈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事件分析
Feb 06 Javascript
JS限制文本框只能输入数字和字母方法
Feb 28 Javascript
javascript html5 canvas实现可拖动省份的中国地图
Mar 11 Javascript
使用Object.defineProperty实现简单的js双向绑定
Apr 15 Javascript
jQuery基本选择器之标签名选择器
Sep 03 Javascript
AngularJS实现DOM元素的显示与隐藏功能
Nov 22 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
js实现文字向上轮播功能
Jan 13 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
JavaScript实现打地鼠小游戏
Apr 23 Javascript
AngularJS实现的回到顶部指令功能实例
May 17 Javascript
vue调试工具vue-devtools安装及使用方法
Nov 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防注入安全代码
2008/04/09 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
PHP 构造函数和析构函数原理与用法分析
2020/04/21 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
jQuery版Tab标签切换
2011/03/16 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
jQuery插件imgPreviewQs实现上传图片预览
2016/01/15 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
python操作MongoDB基础知识
2013/11/01 Python
Python反转序列的方法实例分析
2018/03/21 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
python 弧度与角度互转实例
2020/04/15 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
数据库连接池的工作原理
2012/09/26 面试题
团支书的期末学习总结自我评价
2013/11/01 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
Django框架中表单的用法
2022/06/10 Python