《Nodejs开发加密货币》之十一:一张图熟练使用Async组件解决回调大坑

关于

《Nodejs开发加密货币》,是一个加密货币产品的详细开发文档,涉及到使用Nodejs开发产品的方方面面,从前端到后台、从服务器到客户端、从PC到移动、加密解密等各个环节。代码完全开源、文章免费分享。 相关资源见 http://ebookchain.org

前言

前面说过,在Nodejs的世界里“事事皆回调”,学习使用Nodejs,最不可能回避的就是“回调”(用“调回”更直观些)。无法回避,自然要积极面对,因此开源社区出现了很多代码流程控制的解决方案。比如:bluebird,q,以及这里要图解的async。

这种基础性的技术,社区的文档极其丰富,显然我们没必要重复前人,所以这里采取图解和归类的形式,从操作方面入手。另外,细心的朋友也会从前面的源码分析中发现,亿书大量使用了aysnc,全面掌握它,对于理解和编码,事倍功半。

这是async在https://npmjs.org上的排名,除了lodash,就是它了。而且,bluebird和q也都在前10,也基本说明,使用流程控制组件是Nodejs处理回调的标配。

概念定义

官方介绍:

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, callback(error, 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等,这些都能极大的方便代码撰写,改善代码性能。

脑图

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

源码解读

看看Ebookcoin里面,async的使用吧。因为在《入口程序app.js解读》里,已经提及,这里就不说了,以后遇到再解释。

趣味实践

Async官方文档提供了很多实例, 简单直观。这里,我们不再举例,而是提出一个趣味问题,供思考:

问题:Aysnc能否用于递归调用,比如:某个爬虫程序,遍历某文件夹下全部文件信息的函数等?为什么?

总结

这又是一篇老生常谈的技术分享,但写完之后,对异步操作的流程管理,更加清晰了。Aysnc很好,但也不是万能的,它对于那些反复自调用的代码就无能为力,因为限制任务的回调就是一次。后续,有机会还会继续深入学习研究它。

链接

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

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

电子书阅读: http://bitcoin-on-nodejs.ebookchain.org

参考

async官方文档

Node.js最新技术栈之Promise篇

JavaScript Promise迷你书(中文版)

时间: 2024-10-30 21:33:14

《Nodejs开发加密货币》之十一:一张图熟练使用Async组件解决回调大坑的相关文章

《Nodejs开发加密货币》之二十一:交易

题外话:这篇文章,耗费了我大量精力,用UML表达javascript类及流程本来就不是什么容易的事情,用来描述加密货币交易这种验证逻辑非常多的代码更难,加之Nodejs的回调在这些代码里嵌套很深,所以如何把异步调用变成人类容易理解的顺序调用,也做了一番取舍,时间不知不觉就过了一星期. 所幸,赶在比特币减半的今天完成并发布这篇文章,也算在区块链火热的今天,<Nodejs开发加密货币>走到了一个关键节点:触及了加密货币的灵魂和腹地.动辄几千一枚的比特币等加密货币可能会消亡,但是背后的技术却蓬勃发展

《Nodejs开发加密货币》之十:三张图让你全面掌握加密解密技术

关于 <Nodejs开发加密货币>,是一个加密货币产品的详细开发文档,涉及到使用Nodejs开发产品的方方面面,从前端到后台.从服务器到客户端.从PC到移动.加密解密等各个环节.代码完全开源.文章免费分享. 相关资源见 http://ebookchain.org QQ交流群: 185046161 前言 加密解密技术,涉及面很广,这里,把前人的研究成果汇总起来,通过图表的形式来帮助记忆和筛选,方便日后使用.内容主要包括两个方面,一个是场景与算法,一个是Nodejs的相关模块或组件.共三张脑图,具

《Nodejs开发加密货币》之二十六:轻松从Js文件生成UML类图

前言 上一篇<函数式编程入门经典>,罗嗦了很长,很多小伙伴看得云里雾里.这里提供一个实例,让大家切身感受函数式编程的奥妙和趣味.当然,仅仅为了举例而写代码就没有什么意义了,本书提供的例子都是承担了某项任务的具体项目或工具,这个例子自然也不能例外. 本书用到了大量的Uml类图,经常有小伙伴问我用什么工具画的.说实话,前几篇是我个人一点点手工整理的,但后来就感觉在浪费生命,作为程序员,怎么可能容忍这样的事情反复发生.所以,就有了 js2uml(见参考)这个小工具.只不过,当初目的单一,仅仅使用正则

《Nodejs开发加密货币》之十五:加密货币就是货币

这是一篇加密货币的入门文章,是对<Nodejs开发加密货币>的入门指南部分的补充,主要写给那些没有接触过比特币.加密货币的小伙伴,接下来的内容,都将与加密货币相关. 前言 "加密货币就是货币"听起来挺"白痴的".想想背后的意思,言外之意就是"加密货币可能不是货币",就非常值得玩味了.事实上,在我接触的很多朋友当中,一开始认为后者的更多.包括我自己,也是经过探究一段时间之后,才认定这个结论的. 惯性定律不仅存在于物质世界,也存在于人类的

《Nodejs开发加密货币》之十二:静态网站开发全景扫描

前言 在前面的入门部分,介绍了Nodejs在前端开发中的应用,并通过具体项目说明了Nodejs在比特币客户端领域被广泛应用.当时为了介绍Nodejs入门技术,一切都是从头创建,没有引入前端框架.但在具体的项目实践中,前端是有框架可以选择的,效率和体验会有明显提升. 具体到前端框架,我的选择是Ember.js.Ember给开发带来一种飞一般的感觉,如果问前端框架哪家强,我会毫不犹豫的说Ember.(具体为什么,网上仍然争论不休,本文不做讨论) 本文重点介绍静态网站的类型,亿书官网的技术选型,以及在

《Nodejs开发加密货币》之九:在Nodejs中使用加密解密技术

关于 <Nodejs开发加密货币>,是一个加密货币产品的详细开发文档,涉及到使用Nodejs开发产品的方方面面,从前端到后台.从服务器到客户端.从PC到移动.加密解密.区款链等各个环节.代码完全开源.文章免费分享. 相关资源见 http://ebookchain.org QQ交流群: 185046161 前言 加密解密技术在加密货币开发中的作用不言而喻.但技术本身并不是什么新鲜事,重要的是如果没有前面的P2P网络,和后面要介绍的区块链,单独的加解密显然没有那么神奇,加密货币也不会成为无需验证.

《Nodejs开发加密货币》之二十七:开发通用的HTML组件

人的懒惰常常是麻烦的开始.多数程序员都希望自己的工作一劳永逸,一次开发,到处使用,成了人人追逐的目标,我也不例外.最初写<Nodejs开发加密货币>系列文章,因为不喜欢设定好了去写,所以目录反复修改,索性弄了小工具gitbook-summary:在写入门文章的时候,反复搜索github,索性把检索与制图集成到一起,弄了个开发语言检索统计工具(见<Node.js让您的前端开发像子弹飞一样>文章实例):阅读源码的时候,手动整理Uml图很辛苦,干脆写成了js2uml工具(见<轻松从

《Nodejs开发加密货币》之八:一个精巧的p2p网络实现

发布本文时,比特币价格 ¥2909.92 / $448.29 .为什么一个凭空设计出来的加密货币如此受追捧?为什么微软.IBM等巨头纷纷进入?为什么尝试了解比特币的技术人员,都会被深深吸引?它到底有什么诱人之处?<Nodejs开发加密货币>,让我们一起探索其背后的密码. <Nodejs开发加密货币>,目的是提供加密货币(亿书币)的详尽开发文档,涉及到使用Nodejs开发产品的方方面面,从前端到后台.从服务器到客户端.从PC到移动.从IO密集型到计算密集型.从中心化到去中心化.加密解

《Nodejs开发加密货币》之七:入口程序app.js解读

入口程序app.js解读 发布本文时,比特币价格 ¥2873.95 / $443.95 .为什么一个凭空设计出来的加密货币如此受追捧?为什么微软.IBM等巨头纷纷进入?为什么尝试了解比特币的技术人员,都会被深深吸引?它到底有什么诱人之处?<Nodejs开发加密货币>,让我们一起探索其背后的密码. <Nodejs开发加密货币>,目的是提供加密货币(亿书币)的详尽开发文档,涉及到使用Nodejs开发产品的方方面面,从前端到后台.从服务器到客户端.从PC到移动.从IO密集型到计算密集型.