浅谈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的为attr添加id title等效果的实现代码
Apr 20 Javascript
jQuery点击tr实现checkbox选中的方法
Mar 19 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
Apr 24 Javascript
js读取配置文件自写
Feb 11 Javascript
javascript基本类型详解
Nov 28 Javascript
JS数组合并push与concat区别分析
Dec 17 Javascript
Javascript 基础---Ajax入门必看
Jul 06 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
Sep 06 Javascript
Angular 4.0学习教程之架构详解
Sep 12 Javascript
javascript中函数的写法实例代码详解
Oct 28 Javascript
详解如何在vue项目中使用layui框架及采坑
May 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文件的自动运行方法分析
2016/05/13 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
2016/05/10 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
Python工厂函数用法实例分析
2018/05/14 Python
TensorFlow实现Logistic回归
2018/09/07 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
Visual Studio code 配置Python开发环境
2020/09/11 Python
python实现控制台输出颜色
2021/03/02 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
采购部主管岗位职责
2014/01/01 职场文书
保密工作实施方案
2014/02/24 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
花坛标语大全
2014/06/30 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
JS如何实现基于websocket的多端桥接平台
2021/05/14 Javascript
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸