Nodejs Async家族初探

概念定义

官方介绍:

Async is a utility module which provides straight-forward, powerful functions for working with asynchronous JavaScript.

简单翻译:Async是一个为处理异步Js提供简单、直接、强大功能的实用模块。

流程类别

仅仅为了好区分、好记忆,简单汇总一下,全部流程应该是下面三种情况(并非官方描述):

1.基本流程

从程序(多个函数)执行顺序的角度考量,包括顺序执行、并行执行、混合执行等基本流程。如果把函数间是否有依赖、是否限制函数执行的数量等,又可继续演化出很多种。

2.循环流程

基于某个条件的循环操作,根据条件使用方式,提供了诸多函数。

3.集合流程

上面都是针对一个或一组数据的处理。现实中,通常要对大批相同或相似的数据,比如:大批文件、地址,进行集中处理。显然,我们第一反应是循环调用上述流程即可,不过Async提供了对集合进行异步操作的工具方法(util),如forEach等,就叫它“集合流程”吧。

使用流程的概念可以明确告诉我们,当使用async.forEach()的时候,是在异步操作,与单纯的forEach方法调用是有区别的。

用法分类

async提供了70多个实用的函数,所有这些函数都遵守一个约定:你定义的异步函数(当作一个任务),最后一个参数必须是callback函数;该callback函数的第一个参数必须是Error,且callback函数调用一次。

这些函数大致分为3类,分别对应上面的3个类别:

1.基本型(一次多任务)

这对应基本流程和演化流程部分,对一项事务,多个任务的操作,调用形式为

async.funName(tasks, callbackerror, results))

这里的funName,包括:series, parallel(parallelLimit), waterfall, auto(autoInject)等。这里的tasks可以是Array形式,也可以是Json形式,或者仅支持其中一种。

如果全部函数执行成功,callback里的results也会对应tasks的形式,将已经执行函数的结果转化为Array或Json形式;如果tasks中有一个函数出错,就会终止后续执行,调用callback,error就是该函数的错误信息,results或仅包含已经执行的结果、或同时包含未执行函数的结果占位符,或什么都不包含直接忽略。至于results具体是什么,一个log语句,自然就能知晓,不必去查文档。

2.循环型(多次单任务)

根据条件不同,可以使用下面的形式调用

async.funName(test, fn, callback)



async.doFunName(fn, test, callback)

这里的funName,包括:whilst(doWhilst),until(doUntil), during(doDuring), retry(retryable),times(timesSeries, timesLimit)、forever(该函数的条件test就不用了,已经暗含条件)。

这里的条件值可以是表达式函数,或具体的次数。区分fn与test的顺序,很简单,只要用英文的意思去理解就可以,比如:async.doWhilst(),必然是先do,后whilst,因此参数自然是async.doWhilst(fn, test, callback)

3.集合型(多次单任务)

这个官方没有当作流程表述,当作集合操作方法提供的,是我个人的理解和杜撰。我觉得把它归为流程控制更好接受和理解。因此,仿造上面的循环型调用方法,只要将条件test改为一个集合就好,集合全部使用数组array形式。

async.funName(arr, iteratee, [callback])

这里的funName,包括:

each, eachSeries, eachLimit
forEachOf, forEachOfSeries, forEachOfLimit
map, mapSeries, mapLimit
filter, filterSeries, filterLimit
reject, rejectSeries, rejectLimit
reduce, reduceRight
detect, detectSeries, detectLimit
sortBy
some, someLimit, someSeries
every, everyLimit, everySeries
concat, concatSeries

当然,async还明确提供了其他几个流程控制,比如:compose,seq,applyEach(applyEachSeries),queue(priorityQueue),cargo,iterator,race等。

另外,还有几个Util(工具)函数,如:apply,nextTick,memoize,unmemoize,ensureAsync,constant,asyncify,wrapSync,log,dir,noConflict,timeout等,这些都能极大的方便代码撰写,改善代码性能。

脑图

上述解释和方法,我们全部放在一张脑图里,结合场景,按图索骥,能够很快找到正确的处理方法。


链接

本系列文章即时更新,若要掌握最新内容,请关注下面的链接

本源文地址: https://github.com/imfly/bitcoin-on-nodejs

电子书阅读: http://book.btcnodejs.com

电子书下载: 下载页面 PDF文件 ePub文件 Mobi文件

参考

async官方文档

Node.js最新技术栈之Promise篇

Async详解之一、二、三(较早版本的)

JavaScript Promise迷你书(中文版)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值