前言
近年来,javascript的世界已经有了显著的变化,客户端的JavaScript应用程序变得越来越复杂,服务器端JavaScript应用(使用node.js)也出现了。
伴随着应用构建越来越复杂,JavaScript程序员越来越需要能够熟练处理异步应用。在早年,JavaScript都是客户端的,程序员只需要处理单个的、独立的异步函数调用,它能够更新一个HTML网页的用户界面。
目前的状况更加丰富多彩了。服务器端的JavaScript应用定期地向多个其它的服务器发送多重异步调用,以制造响应:对数据库,缓存,载入平衡器,文件系统,授权系统,第三方API,等等。与此同时,客户端JavaScript现在例常访问几十个异步API,比如说那些由HTML5以及旧式的AJAX发起的访问。(请记住,Ajax第一个字母代表着异步。)应用程序需要能够协调多个异步API发起的同时调用:取得最快的结果、组合信息、等待多重调用完成、按一定的顺序执行调用、更改依赖于结果的控制流、处理错误,返回轮替的服务(比如说,缓存丢失),重试失败的网络调用,等等。
“回调地狱”,这个词组拥有超过10000个Google页面,描述了当程序员尝试用一个旧式的单调用程序建立一个现代应用时会发生什么。对很多程序员来说,这是他们天天要遇到的疼痛。使用单个回调创建应用,需要做更基本的协调,异步调用可能是很复杂。你必须艰难地思考、经常以复杂的、脆弱的、模糊的解决方案告终。这些包含难以发现的bug,以及难以阅读的文档,而且当需要额外的异步调用请求时,可能很难扩展。用一个单镍的调用模块为多重异步事件编程确实是一个挑战,哪怕对很聪明很有经验的程序员来说也是挑战。
关于你
首先,这本书是写给不太懂延时对象的jquery程序员的。我们发现大多数使用jquery的程序员从未听说过延时对象。在那些听说过延时对象的jquery程序员中,还有很多觉得延时对象很混乱,或者对延时对象有错误的印象,觉得它太抽象,或者难以理解。延时对象容易被误解,尽管有强大的编程范利。近年来,很多JavaScript库和JavaScript框架都已经添加了延时对象,而且吸引了日益广泛注意。现在在StackOverflow中搜索deferreds,会给出超过18000个页面,超过40%的是最近6个月里创建的。
我们希望帮助客户端的JavaScript程序员,以及服务器端的JavaScript程序员,懂得延时对象,但是不太会用它们的那些人。如果你希望加强你的实践知识,请多看实战示例,而且从不同的角度思考“延时”,我们热切希望你成为一个读者。我们希望帮助你延伸你的认识,在广度和深度方向上。这本书有18个延时对象的实践示例,以及75个挑战(以及它们的解决方案),以推动你的思考。
最后,以及最有雄心的是,我们希望我们写了一本有用的书,而且能够激发程序员在jquery中使用延时对象以及应答对象,甚至在JavaScript中使用延时对象以及应答对象。延时对象概念上的基础在多个JavaScript包以及别的支持它的编程语言中几乎都是一样的。因为概念是如此类同以及精炼,你将会发现它在我个实现中直截了当地转向代码。事实上你在这本书中学到的所有的知识,对别的使用延时对象的工作都很有用。我们期望它成为一个有趣的、有价值的阅读,无论你使用的是哪种语言。我们写这本书,是希望我们关于延时对象的研究对你来说有用。
我们的目标
在这本书中,我们将教会你如何在使用延时对象时避开回调地狱。
但是不仅仅是延时。延时对象提供了一些过去不具有的功能:一个简单的处理未来结果的机制。这给你一个机会,用另一种方法,并非仅仅是语法的简化。它给你一个机会真正思考程序的实践,扩大化你的脑力工具包。这种想法当然是具有风险性的。包括关于使用延时包的结论,以及在给定条件下使用它是否更敏感。对我们来说,学习的过程,以及开始把延时对象应用于编程中,是一个我们大脑中长出新肌肉的感觉。
我们最初的目标是把延时对象介绍给还没有临略过它的程序员。我们的目标是给你一个现成的强大的普通的具体的理解,关于延时对象是什么,以及如何把握它们。如果我们成功了,如果你在一些上下文中遇到延时对象:无论是使用别的JavaScript延时包或者是在别的编程语言中遇到它,你将完全胸有成竹。
第二个目标是提供了个广阔的示例集合,不平凡的真实世界,使用延时对象的示例。我们已经有7年的用延时对象编程(用Pythen以及JavaScript)的经历了,还把一些我们在这段时间里制作的很有用的示例放到一起。它们一般是互相关联的一小段代码,不超过100行,但是有时候需要仔细思考以实现开发。我们希望第三章中的这些详细的代码案例将在你将来需要面临延时问题的时候占一席之地。
挑战
第三章中的延时对象代码案例,给你留了一些挑战。这意味着鼓励你与它接洽,并根据呈现的材料深入思考。如果你想写代码,那是一个红利。无论如何,重要的是去思考。不要仅当一个被动消极的读者。使用延时对象经常需要集中在思考问题是什么,以及它上面的变化,可以被解决。一旦你得到了延时对象,用它解决疑难将是非常有吸引力的。你用它越多,你将得到越多,而且你将发现更多关于它的灵活性和强大。总而言之,计算出如何使用