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 异步流程控制规则的更多相关文章

  1. nodejs进阶(7)—async异步流程控制

    Async介绍 Async是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 m ...

  2. async异步流程控制

    http://cnodejs.org/topic/54acfbb5ce87bace2444cbfb 先安装:G:\www\nodejs\one\models>npm install async ...

  3. async异步流程控制神器

    async https://www.npmjs.com/package/async Async is a utility module which provides straight-forward, ...

  4. Nodejs中使用异步流程控制Async

    首先,我们都知道,Node基于事件驱动的异步I/O架构,所谓异步就是非阻塞,说白了就是一个事件执行了,我不必等待它执行完成后我才能执行下一个事件.所以在Node环境中的模块基本都是异步的,上一篇说到我 ...

  5. node核心:异步流程控制

    Node.js的异步是整个学习Node.js过程中重中之重. 1)异步流程控制学习重点 2)Api写法:Error-first Callback 和 EventEmitter 3)中流砥柱:Promi ...

  6. 【javascript】Promise/A+ 规范简单实现 异步流程控制思想

    ——基于es6:Promise/A+ 规范简单实现 异步流程控制思想  前言: nodejs强大的异步处理能力使得它在服务器端大放异彩,基于它的应用不断的增加,但是异步随之带来的嵌套.难以理解的代码让 ...

  7. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  8. js 异步流程控制之 avQ(avril.queue)

    废话前言 写了多年的js,遇到过最蛋疼的事情莫过于callback hell, 相信大家也感同身受. 业界许多大大也为此提出了很多不错的解决方案,我所了解的主要有: 朴灵 event proxy, 简 ...

  9. 异步流程控制库GoWithTheFlow

    异步流程控制库GoWithTheFlow 一个尾触发方式来控制异步流程的库, 有seq(顺序执行) par(同步执行) 两种方法 博客 http://notes.jetienne.com/2011/0 ...

随机推荐

  1. cf C. Sereja and Algorithm

    http://codeforces.com/contest/368/problem/C 从左向右记录从1位置到每一个位置上x,y,z的个数.然后判断在l,r区间内的x,y,z的关系满不满足abs(x- ...

  2. POJ 1755 Triathlon

    http://poj.org/problem?id=1755 题意:铁人三项,每个人有自己在每一段的速度,求有没有一种3条路线长度都不为0的设计使得某个人能严格获胜? 我们枚举每个人获胜,得到不等式组 ...

  3. Linux生成core文件、core文件路径设置

    在Linux下产生并调试core文件 先看看我用的是个什么机器: $ uname -aLinux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT ...

  4. 利用Visual Studio寻找C#程序必要的运行库文件

    在工程打包中,有时候很头痛的就是运行所需要的库文件不能够全面的包含进来,特别是有时候调用了一系列外部扩展.对于这些问题,我们可以借用Visual Studio的打包功能帮助我们寻找软件运行必须的库文件 ...

  5. C# - 创建List属性的简单方法

    不用担心List没有创建问题. private ObservableCollection<EquipmentItem> _optionalCollection; public Observ ...

  6. User Defined Runtime Attributes

    设置View borderWidth/cornerRadius/borderColor 为了兼容CALayer 的KVC ,你得给CALayer增加一个分类 CALayer+BorderColor.h ...

  7. Laravel-路由-控制器

    (慕课网_轻松学会Laravel-基础篇_天秤vs永恒老师) 一.基础路由 二.多请求路由 三.参数路由 四.路由别名 生成url可以使用别名 五.路由群组 六.路由输出视图 七.控制器参数绑定

  8. 【git 问题小说说】 git add时候报错:LF will be replaced by CRLF

    本文来自:http://blog.csdn.net/loovejava/article/details/22114477 最近工作在window平台,不怎么使用命令行了所以导致很多命令都不熟悉啦 哈哈 ...

  9. Dalvik虚拟机Java堆创建过程分析

    文章转载至罗升阳CSDN社区博客,原地址: http://blog.csdn.net/luoshengyang/article/details/6557518 近年来,手机移动平台越来越火爆.打开自己 ...

  10. hdu1015(Safecracker )

    Problem Description === Op tech briefing, 2002/11/02 06:42 CST === "The item is locked in a Kle ...