流程控制库async
看看npmjs.org
里的模块依赖排行榜,async
常期排在前三,可见此库确实不错,今天就来简单的说说它的作用
async
是nodejs
里的流程控制模块,也可以用在浏览器端,主要是用来控制多个异步调用时的顺序以及依赖,在不用async
之前,多个异步调用通常是这样的
fs.readFile('file1', function(){fs.readFile('file2', function(){fs.readFile('file3', function(){//.....})});
})
当业务比较复杂的时候,异步嵌套将会更深,这样就会形成异步地狱
,这样非常不利于代码维护以及业务处理,而且对异常处理也不方便,下面我们来看看用async
是怎么解决的,当然这种情况用promise
机制来处理也可以,但是今天这里只讲async
.
async.series
串行执行多个异步方法,使嵌套调用扁平化
async.series([
function(callback){fs.readFile('../data/file.txt', 'utf8', callback);
},
function(callback){fs.readFile('../data/file1.txt', 'utf8', callback);
}],
function(err, results){if(err) {console.log(err)}else{console.log(results);}
});
series
允许传递两个参数,第一个参数代表要异步执行的所有函数,后一个参数是当前面所有异步执行完之后执行的一个回调函数,只要有一个异步方法异步,则直接执行回调函数,err
参数就是异常信息,当所有的异步方法执行成功之后,回调函数里的result
保存的前面所有异步方法执行的结果.
- 注意代码里的
callback
为async
自己传递的固定参数不可更改.
series
是串行执行的,也就是说当异步方法比较多的时候,其实串行执行的效率并不是很高,假如异步方法之前没有依赖关系的话,完全可以并行执行,下面我们来看看async
提供的并行方法
async.parallel
并行执行多个异步方法,并返回多个结果组成的数组
async.parallel([
function(callback){fs.readFile('../data/file.txt', 'utf8', callback);
},
function(callback){fs.readFile('../data/file1.txt', 'utf8', callback);
}],
function(err, results){if(err) {console.log(err)}else{console.log(results);}
});
parallel
在执行没有依赖关系的异步操作时候,效率还是不错的,回调函数跟上面的series
一样,只要有一个异步方法出现异常,则传递异常信息给回调的第一个参数,都成功则results
返回包含所有结果的数组.
- 注意代码里的
callback
为async
自己传递的固定参数不可更改.
了解了串行和并行的方法之后,有一个问题那就是当后面的异步方法需要前面的异步方法返回的结果作为依赖的时候怎么办呢,async
也提供了这样的方法
async.waterfall
前面异步方法返回的结果作为后面异步方法的条件,依次串行执行异步方法,最后返回最后一个异步方法的结果
async.waterfall([
function(callback){fs.readFile('../data/file.txt', 'utf8', function(err, content){callback(err, content);})
},
function(arg1, callback){fs.readFile('../data/' + arg1, 'utf8', callback);
}],
function(err, results){if(err) {console.log(err)}else{console.log(results);}
})
waterfall
方法就是用来处理异步方法之间的依赖的,这里跟上面的区别在于callback
方法传递了两参数,null
,content
, 第一个参数代表是否异常;第二个参数代码当前异步方法返回的结果,这个值将会作为下一个异步方法的参数,比如这里的function(arg1, callback)
,arg1
参数就是前一个异步方法返回传递的结果,假如后面的异步方法不需要前面的依赖则不用传递这个参数,像上面的第二异步方法那样
- 注意代码里的
callback
为async
自己传递的固定参数不可更改.
当异步方法之前的依赖关系从一对一变到一对多了怎么办呢,上面的方法只有处理一对一的关系,一对多的话则不行,下面来看看async
提供的超级好用的方法auto
async.auto
智能根据配置文件执行异步方法,支持一对多的情况
var deps = {'file': function(callback){fs.readFile('../data/file.txt', 'utf8', function(err, content){callback(err, content); // => file1.txt});},'file1': function(callback){fs.readFile('../data/file2.txt', 'utf8', function(err, content){callback(err, content); // => ../data/});},'action': ['file', 'file1', function(callback, result){fs.readFile(result.file1 + result.file, 'utf8', function(err, content){callback(err, { result: content, xuwm: 'feenan'});});}]
};async.auto(deps, function(err, result){console.log(result);
});
auto
方法会根据异步方法里的依赖关系,保证在依赖方法执行完成之后再去执行异步方法,auto
允许传递两个参数,第一个参数是异步方法关系的定义,是一个key-vale方式的键值对,值传递单个函数则表示没有依赖,传递数组的话,数组内前面写上依赖的键值,最后写上异步方法.
- 注意这里的异步方法会依赖前面异步方法返回的结果,所以
callback
会传递两参数,异常和结果
总结
其实async
还有很多别的功能,本身也提供了很多数组相关的操作,更多信息请看这里async git.
流程控制库async相关推荐
- nodejs异步流程控制
场景: 1.图片上传服务器 2.图片写入磁盘 3.图片写入数据库 在nodejs里面这三种方式都是异步操作,不想java其他语言同步进行,这就需要对异步流程进行控制,保证1,2,3逐步进行.有可能1还 ...
- mysql 控制函数库_数据库开发——MySQL——函数与流程控制
一.函数 1.介绍 1.1.数学函数 ROUND(x,y) 返回参数x的四舍五入的有y位小数的值 RAND() 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定 ...
- JavaScript异步流程控制的前世今生
js的流程控制老大难问题就是异步回调. 一个流程过程,往往会出现回调地狱,这个回调异步控制就被提上研究得议程. 目前有实现的回调流程有以下几种 回调函数实现 事件监听 发布订阅 Promise/A+ ...
- Python学习:深入Python流程控制
本文来自:入门指南 开胃菜参考:开胃菜 使用Python解释器:使用Python解释器 本文对Python的简介:Python简介 目录: 目录: 4. 深入 Python 流程控制 4.1. if ...
- Shell程序设计 | 基本语法 :变量、I/O、算术运算、条件判断、流程控制、函数
文章目录 变量 环境变量 位置变量 特殊变量 自定义变量 数组 I/O printf / echo read 算术运算 let expr 条件判断 test 常用判断条件 流程控制 if case f ...
- Node.js 模块之Nimble流程控制
NodeJS异步的特性有时候会导致程序非常的难看,回调一层套着一层,这个时候就要用流程控制模块来控制究竟是同步还是异步了. Nimble是一个轻量.可移植的函数式流程控制模块.经过最小化和压缩后只有8 ...
- JS_异步任务之流程控制
需知: 1,JavaScript只有一个核心的主线程,但它有存放异步任务的任务队列(task queue). 2,主线程中是正在运行的同步任务(异步任务开始运行则也会变为同步任务),每次同步任务完成后 ...
- java流程控制both_java web面试题
[1.jsp和servlet的区别.共同点.各自应用的范围??JSP是Servlet技术的扩展,本质上就是Servlet的简易方式.JSP编译后是"类servlet".Servle ...
- 流程控制: jQ Deferred 与 ES6 Promise 使用新手向入坑!
谢谢n͛i͛g͛h͛t͛i͛r͛e͛大大指出的关于Promise中catch用的不到位的错误,贴上大大推荐的文章Promise中的菜鸟和高阶错误,文章很详细说明了一些Promise使用中的错误和指导. ...
最新文章
- 《Objective-c》Foundation框架 -(结构体:Range、Point、Size、Rect)
- 组合,多态,封装, @property
- 洛谷P1466 集合 Subset Sums
- another app is currently hold yum lock问题
- 苏州市计算机音乐学会地点,苏州市音乐家协会小提琴学会成立
- 【日期、时间】javascript字符串转日期类型
- 湖南工程学院计算机网络考试,湖南工程学院 计算机网络期末试卷试题
- 8.FreeRTOS学习笔记-软件定时器
- 第十五回(二):文会内战平分秋色 树下阔论使坏心焦【林大帅作品】
- GeoServer的安装与数据服务发布
- C++中的void类型
- springboot项目中使用spring的xml文件
- python字符串转为ascii码_Python转义字符及用法
- 无需activity获得屏幕尺寸
- Atitit 并发处理 go与 java对比较 目录 1. 并发编程的七个模型 线程,fp,actor,csp 数据级并行 Lambda	1 2. 四种并发编程模型简介 多线程,callback
- 卡巴斯基2010 授权文件可以使用一年
- 西数硬盘刷新固件_彻底解决硬盘测试曲线的困惑
- python中几种去重的方法
- WEB安全全基础漏洞学习
- 数据恢复 diskginus
热门文章
- virtual hust 2013.6.20 数论基础题目 E - Uniform Generator
- Windows下使用VS2008+CUDA3.0开发的详细配置 (Setup CUDA 3.0 on VS2008 in Windows)
- SQL2005性能分析一些细节功能你是否有用到?(二)
- ASP.NET中Session模型简介
- lua4.0中实现% 取余操作
- C++_类和对象_C++多态_案例3-电脑组装---C++语言工作笔记075
- 人工智能与机器学习的关系---人工智能工作笔记0013
- 基于Spring Security的认证授权_应用详解_会话管理_Spring Security OAuth2.0认证授权---springcloud工作笔记129
- k8s核心技术-Helm(chart模板的使用下)---K8S_Google工作笔记0049
- Java中遍历文件夹的2种方法