async 异步流程控制规则
github 学习async网址 : https://github.com/caolan/async/
1.Async 函数介绍
async 主要实现了三个部分的流程控制功能
1.集合:Collections
2.流程控制:Control Flow
3.工具类:Utils
1:集合 Collections
each 如果相对同一个集合中的所有元素都执行同一个异步操作
map 对集合中的每一个元素,执行某个异步操作,得到结果。所有结果将汇总到最终的callback 里 与 each 的区别是 ,each 只关心操作不管最后的值,而map 关心的时候最后产生的值
filter 使用异步操作 对集合的元素进行筛选,需要注意的是,iterator 与 callback只有一个参数,只能接收true 或 false
reject reject跟filter正好相反
reduce 可以给我们定一个初始值,用它与集合中的每一个元素做运算,最后得到一个值,reduce 从左向右来遍历元素,如果想从右向左,可以使用reduceRight
detect:用于取得集合中满足条件的第一个元素
concat:将多个异步操作的结果合并为一个数组
2.控制流程 Control Flow
series:串行执行,一个函数数组中的每个函数,每一个函数执行完成之后才能执行下一个函数。
parallel:并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行,传给最终callback 的数组中的数据按照tasks 声明的顺序,而不是执行完成的顺序。
whilst:相当于while .但其中的异步调用将在完成后才会进行下一次循环
forever 无论条件循环执行 如果不出错 callback 永远不会被执行
waterfall 按顺序 一次执行一组函数,每个函数产生的值 都将传给下一个。
3.工具类 Utils
memoize : 让某一个函数在内存中缓存它的计算结果,对于相同的参数,只计算一次,下次就直接拿到只算好的结果。
unmemoize:让已经被缓存的函数,返回不缓存的函数引用
log:执行某异步函数,并记录它的返回值,日志输出
dir:与log类似,不同之处在于 会调用浏览器的console.dir()函数,显示为dom视图
noConflict 如果之前在全局定义了async 变量,当导入本async.js 时,会先把之前的async变量保存起来,然后覆盖它,仅仅用于浏览器端,在nodejs 中没有
==================================================================================
series 函数 串行执行
async.series({
one:function(callback) {
callback(null,'one');
},
two:function(callback) {
callback(null,'two');
},
three:function(callback){
callback(null,'three');
}
}, function(err, results) {
console.log("=======================");
console.log(results); //{ one: 'one', two: 'two', three: 'three' }
});
数组形式的例子:
async.series([
function(callback) {
callback(null,'one');
},
function(callback) {
callback(null,'two');
},
function(callback){
callback(null,'three');
}
], function(err, results) {
console.log("=======================");
console.log(results); //['one','two','three']
});
series 函数第一个参数可以是一个数组,也可以是一个json 对象
waterfall 函数 ,瀑布流
waterfall 是按照顺序执行,每个函数产生的值都将传给下一个函数
async.waterfall([
function(callback){
callback(null,'one','two');
},
function(arg1,arg2,callback){
callback(null,'three');
},
function(arg1,callback){
callback(null,'done');
},
],function(err,result){
console.log(result);//done
})
waterfall 的tasks 参
数(数组内的函数)只能是 数组类型的
当中途有函数出错,其err 直接传给callback,结果被丢弃,后面的函数不再执行
parallel(tasksm[callback])
paralle 函数是并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行
传给最终callback的数组中数据按照tasks 中声明的顺序,而不是执行完的顺序,实例如下
async.parallel([
function(callback){
console.log("1111111",req.query.page);
if(req.query.page == 4){
callback(null,'one');
}else{
console.log("0000000000000000000");
callback(null);
}
},
function(callback){
callback(null,'two');
},
function(callback){
callback(null,'threee');
},
function(callback){
callback(null,'four');
}
],function(err,results){
console.log(results);
})
async 异步流程控制规则的更多相关文章
- nodejs进阶(7)—async异步流程控制
Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...
- async异步流程控制
http://cnodejs.org/topic/54acfbb5ce87bace2444cbfb 先安装:G:\www\nodejs\one\models>npm install async ...
- async异步流程控制神器
async https://www.npmjs.com/package/async Async is a utility module which provides straight-forward, ...
- Nodejs中使用异步流程控制Async
首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件.所以在Node环境中的模块基本都是异步的,上一篇说到我 ...
- node核心:异步流程控制
Node.js的异步是整个学习Node.js过程中重中之重. 1)异步流程控制学习重点 2)Api写法:Error-first Callback 和 EventEmitter 3)中流砥柱:Promi ...
- 【javascript】Promise/A+ 规范简单实现 异步流程控制思想
——基于es6:Promise/A+ 规范简单实现 异步流程控制思想 前言: nodejs强大的异步处理能力使得它在服务器端大放异彩,基于它的应用不断的增加,但是异步随之带来的嵌套.难以理解的代码让 ...
- 使用yield进行异步流程控制
现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...
- js 异步流程控制之 avQ(avril.queue)
废话前言 写了多年的js,遇到过最蛋疼的事情莫过于callback hell, 相信大家也感同身受. 业界许多大大也为此提出了很多不错的解决方案,我所了解的主要有: 朴灵 event proxy, 简 ...
- 异步流程控制库GoWithTheFlow
异步流程控制库GoWithTheFlow 一个尾触发方式来控制异步流程的库, 有seq(顺序执行) par(同步执行) 两种方法 博客 http://notes.jetienne.com/2011/0 ...
随机推荐
- Eclipse项目导入Android Stuio 配置出现 Timeout waiting to lock buildscript class cache for build file 'H:\studioproject\Generic_SN\build.gradle'
Eclipse项目导入Android Stuio 配置出现 Error:Timeout waiting to lock buildscript class cache for build file ...
- awk的日志模块追加日期时间字段的方案
function test() { i = ) { system("sleep 1") "date +'%Y-%m-%d %H:%M:%S'" | getlin ...
- angularJs项目实战!03:angularjs与其他类库的协作
引言:angularjs是一个中等重量级的前端开发框架 HTML是一门很好的为静态文本设计的语言,但要构建动态的web应用它就显的乏力了.通常,我们使用以下技术来解决静态网页技术在构建动态应用上的不足 ...
- 如何解决Bluetooth系统设计的棘手问题
我们若想设计一套完善的蓝牙 (Bluetooth) 系统,就必须充分掌握其中的技术知识,例如协议堆栈.射频设计及系统集成等方面的专门知识.LMX9820 芯片的面世令蓝牙系统的设计工作变得更为容易.以 ...
- CentOS下Qt窗口透明效果失效,成黑色背景的问题
一.问题 Linux系统下Qt窗口的透明效果成了黑色,但同样的代码在windows机子上有透明效果,主要是修改系统的配置,仅在centos6.3及其以上版本实验过.其他系统可以相应配置. 二.问题运行 ...
- 如何修改Qt标准对话框的文字(例如,英文改成中文)
此篇文章参考qtcn论坛整理而成,因为文字和图片是本人亲自组织,所以仍算原创. http://www.qtcn.org/bbs/read-htm-tid-30650.html http://blog. ...
- Powershell访问数组
数组的元素可以使用索引寻址,第一个元素的索引为0,第i个元素的索引为i-1,最后一个元素的索引为Count-1,但是Powershell为了使用方便,直接可以将 -1 作为最后的一个元素的索引. PS ...
- 一些pyhon的学习资料
一直没有时间学习python,都说python语法简洁优美.但是我看它的语法还是不爽啊,没C/C++好阅读.但是C/C++又必须了解底层的计算机模型.着实会门槛高一些.特别是C++,对于我来说简直就是 ...
- Cmake Error: your compiler "cl" was not Found .etc
又是环境变量路径等问题,烦死人了. TIPS:请注意,控制台的窗口也有自己的环境变量,从系统环境变量和用户环境变量继承过来的,一个窗口(控制台)可以添加属于自己的环境变量(跟别的控制台窗口没关系) 解 ...
- pmp论坛
PMP论坛: http://www.px101.com/specialpmp/ http://www.pmp.cn/ http://www.pmptuan.com/ http://www.mypm.n ...