Async流程控制学习

今天学习nodeJS深入浅出的第四章。
node异步控制有提到Async的强大流程控制能力,我觉得有必要学习下,所以去翻了Async的API。
作为一个英文渣渣,API的英文阅读实在不是一件很爽的事情,所以写下这篇文章作为我的Async中文的API.

Collections

Async集合处理函数格式
  async.xx(coll, function, callback);
  coll:Array|iteratee|Object
  iteratee:function//异步处理函数function(item, callback)
  callback

Async集合的返回必须都是callback返回!例如:
  async.concat(["1","2","3"], function(item, callback){
    callback(null,item);//在这里回调返回
  },function(err, values){
     console.log(values);//这里才可以获取到值
  });

基本每个函数都有Series串行方法和Limit并行方法的数量限制方法。
异步处理函数默认的参数列表:[obj,] value [,key], callback

<h4 id = "each">each</h4>

这里函数用each或者forEach都可以

each对每个元素进行相同的处理,无返回。
eachSeries顺序执行异步处理函数。
eachLimit设置最大并行数。

<h4 id = "eachOf">forEachOf</h4>

eachOf区别于each之处在于异步处理函数有三个参数function(value, index,callback)

<h4 id = "map">map</h4>

map与each相同都是对列表中每个元素进行处理,不过map有返回。
区别于concat,map的返回列表元素就是原来的列表元素数,不会改变数量,而concat可以改变数量。
mapSeries顺序执行异步处理函数。
mapLimit设置最大并行数。

<h4 id = "mapValues">mapValues</h4>

mapValues与map相同,不过mapValues是专门设计为Object。
它的异步处理函数function(value, key, callback),可以处理key-value键值对。
mapValuesSeries顺序执行异步处理函数。
mapValuesLimit设置最大并行数。

<h4 id = "concat">concat</h4>

conat对列表每个元素进行处理并返回处理结果组成一个新的列表。
cancatSeries顺讯进行异步函数处理

<h4 id = "filter">filter</h4>

filter用于筛选符合条件的元素。callback返回必须为true OR false。
filterSeries顺序执行异步处理函数。
filterLimit设置最大并行数。

<h4 id = "reject">reject</h4>

reject和filter的行为正好相反,false时返回,true时丢弃。
rejectSeries顺序执行异步处理函数。
rejectLimit设置最大并行数。

<h4 id = "detect">detect</h4>

detect用于取得列表中第一个符合条件的元素。callback必须返回为true OR false。
detectSeries顺讯进行异步函数处理
detectLimit异步方式设置最大并行数,加到第一第二参数中间。

<h4 id = "every">every</h4>

这里函数用every或者all都可以

every用于判断所有元素是否满足条件,异步处理callback必须返回true OR false
everySeries顺序执行异步处理函数。
everyLimit设置最大并行数。

<h4 id = "some">some</h4>

这里函数用some或者any都可以

some用于判断所有元素中是否有满足条件的,异步处理callback必须返回true OR false
someSeries顺序执行异步处理函数。
someLimit设置最大并行数。

<h4 id = "reduce">reduce</h4>

reduce给定一个初始值,用它和集合中的每个元素做运算,最后返回一个值。即初始值加上列表中所有的值。
顺序为从左到右
async.reduce(arr, memo, iterator(memo,item,callback), callback(err, result))
注意:reduce没有异步方式

<h4 id = "reduceRight">reduceRight</h4>

reduceRight不同于reduce的地方在于它的顺序是从右往左。

<h4 id = "sortBy">sortBy</h4>

sortBy对集合内的元素进行排序,依据每个元素进行某异步操作后产生的值,从小到大排序。

<h4 id = "transform">transform</h4>

transform有点像map,不过他可以对Object操作
数组:function (acc, item, index, callback)
集合:function (obj, val, key, callback) 

Control Flow

对于JavaScript的异步大坑估计我们都不陌生,解决办法无非就是那三种。
  1. 事件监听
  2. Promise
  3. 流程控制
其实用的最多的还是Promise,不过Promise有个问题一直在困扰着我。
返回怎么才能返回一个正常的值而不是一个Promise对象。

Async以它的流程控制能力而著称,始终保持前三的地位!我继续学习。

<h4 id = "applyEach">applyEach</h4>

applyEach(functions, …argsopt, callbackopt)
更加强大的each,将参数分别执行多个异步处理函数,类似于
async.each(…argsopt,async.applyEach([functions]),callback);
applyEachSeries同步执行方法

<h4 id = "auto">auto</h4>

auto(tasks, concurrencyopt, callbackopt)
多个函数有依赖关系,有的并行执行,有的依次执行的情况
concurrencyopt为max number
返回一个JSON的处理列表
格式:
    functionname:function(callback){}//无依赖
    functionname:['依赖一','依赖二',...,function(callback){}]//存在依赖

<h4 id = "autoInject">autoInject</h4>

autoInject(tasks, callbackopt)
自动注入依赖
格式:
    functionname:function(依赖一,依赖二,...,callback){}

<h4 id = "cargo">cargo</h4>

一个串行的消息队列,类似于queue,通过限制了worker数量,不再一次性全部执行。
不同之处在于,cargo每次会加载满额的任务做为任务单元,只有任务单元中全部执行完成后, 才会加载新的任务单元。
http://caolan.github.io/async/docs.html#.cargo

<h4 id = "compose">compose</h4>

compose(…functions)
还记得回调地狱吗?
自动回调地狱模式,例如compose(a,b,c,d) = a(b(c(d())))

<h4 id = "whilst">whilst</h4>

whilst(test, iteratee, callbackopt)
异步模式的循环和同步的while语句相似
test相当于while语句的条件,return为false时停止
iteratee相当于while的执行块,通过callback返回
实例:
    var count = 0;
    async.whilst( 
        function() { return count < 5; }, //判断模块
        function(callback) { //迭代模块,通过callback返回
          count++;
          setTimeout(function() { 
            callback(null, count);
         }, 1000); 
      }, 
      function (err, n) { // 5 秒后, n = 5 }//若判断模块为false,这里才能收到callback
    );

这里until,During,doWhilst,doUntil,doDuring与whilst相似//其实是不想写了,api估计也这么想的

<h4 id = "forever">forever</h4>

<h4 id = "parallel">parallel</h4>

parallel(tasks, [callback])
并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据
按照tasks中声明的顺序,而不是执行完成的顺序。

如果某个函数出错,则立刻将err和已经执行完的函数的结果值传给parallel最终的callback。其它未执行完的
函数的值不会传到最终数据,但要占个位置。

同时支持json形式的tasks,其最终callback的结果也为json形式。
有点像Promise.all()

parallelLimit(tasks, limit, callbackopt)限制最大并行数

以上文档参考

async API
Async详解之一:流程控制
nodejs Async详解之三:集合操作
node js 异步执行流程控制模块Async介绍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • async是一个使用比较广泛的JS异步流程控制模块,除了可以在Nodejs上运行,也可以在浏览器端运行,主要用于优...
    IT小C阅读 2,120评论 0 2
  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,467评论 0 23
  • 哼、天黑了我需要一盏灯 我却只有一盏烛光 哼、我饿了想要一桌酒席 我却只有小菜粥浆 哼、我累了想要一张大床 我却只...
    心坑阅读 249评论 3 1
  • 基本概念:DOM事件的级别 DOM0:element.onclick=function(){}DOM1:(没有设计...
    一个废人阅读 309评论 0 0
  • 作为前端的好孩子,总会遇到一个经典不朽的问题:有几种闭合内部浮动的方法?哈哈,是不是想说这个能难得住我?马上能列出...
    Candy程阅读 221评论 0 0