JavaScript的Deferred是比较高大上的东西, 主要的应用还是主ajax的应用, 因为JS和nodeJS这几年的普及, 前端的代码越来越多, 各种回调套回调再套回调实在太让人崩溃, 所以就从后端拖了一个延迟对象这货, 用来解决回调地狱这个问题 。
我们使用ajax的时候多数都是为ajax添加回调 ,然后异步向服务器发送请求, 比如如下原生的XHR代码:
填坑必备 data
因为jQ1.5以后版本的ajax的实例对象继承了延迟对象, 我们可以使用ajax实例的then或者done以及fail等等方法 ,所以上面的代码可以改写为:
填坑必备
//bootcdn这个cdn满好用的, 上面好多库哇, 推荐一下;data
下划线的这个是网上抄的,不想看可以略过:异步模式在web编程中变得越来越重要,对于web主流语言Javscript来说,这种模式实现起来不是很利索,为此,许多Javascript库(比如 jQuery和Dojo)添加了一种称为promise的抽象(有时也称之为deferred)。通过这些库,开发人员能够在实际编程中使用 promise模式。
先说下延迟对象的三种状态, 当一个延迟对象被初始化那么该对象默认为peding状态
1:pending等待状态
2:fulfilled执行完成状态
3:rejected拒绝状态;
延迟对象的两个主要方法:
1:add 这个方法是添加成功回调
2:fail 这个方法是添加拒绝回调
延迟对象比较高级的方法:
1:then方法; 该方法返回一个包裹了旧延迟对象的新延迟对象
2:promise方法;这个对象返回的是阉割后的Defered(延迟对象),主要作用是保护原来延迟对象;
3:when这个方法不是在延迟对象的实例上, (根据库的不同, when这个方法在不同的地方,比如jQ的when方法是$.when,别的库( •̀ ω •́ ) 也说不准, 反正when的源代码是在Deferred附近), 但是和延迟对象息息相关, 因为这个方法返回的也是一个延迟对象, 顾名思义when的作用就是:when你传的几个延迟对象全部resolve以后, when的返回实例会resolve....懂得自然懂, 不急;
下面这张图是jQ这个Deferred实例对象的方法, 提供参考:
以下的JS代码是《司徒框架设计》里面介绍的延迟对象mochikit, 可以自己在控制台跟踪一下就知道执行的流程:
mochikit延迟对象源代码如下, 这个延迟对象很好理解;GitHub的地址是: https://github.com/mochi/mochikit/
无标题文档
博客园上博友教你写一个比较简单的延迟对象, 地址是: http://www.cnblogs.com/ygm125/p/3735677.html
是代码量比较少的, 也好理解, 实在不懂就开控制器一步一步跟踪, 多看几遍, 不懂都说不过去:
无标题文档
公司这边的老段写的Deferred, 是从TypeScript编译成js的, 因为这个东西比较简单, 应该不算泄露公司机密哇, 代码的最后有几个使用的实例, 你点击运行即可查看, 有兴趣自己写一个延迟对象, 印象会更加深刻:
无标题文档
jQ1.7的延迟对象, 代码量比较少, 依赖callbacks,不太好懂, 慢慢看,参考jQ的延迟对象分析: http://www.cnblogs.com/snandy/archive/2012/12/19/2812935.html
要先弄懂callbacks这个方法, 才能在弄懂Deferred, when也只是一个Deferred的包装。 建议先看1.5版本的Deferred, 弄懂了再看1.7的Deferred, 下面的Deferred被我单独裁出来了,可以单独运行, 里面的注释是博客园的好像是aaron写的代码解析, 辅助大家看一下:
ES6原生的好像支持PROMISE么么哒,O(∩_∩)O哈哈~;
参考链接:
用法:
阮一峰的jQuery.Deferred对象: http://javascript.ruanyifeng.com/jquery/deferred.html
Aaron:
Aaron深入分析延迟对象:http://www.cnblogs.com/aaronjs/p/3356505.html
Aaron 分析 Deferred概念 :http://www.cnblogs.com/aaronjs/p/3348569.html
github:
when的主页: https://github.com/cujojs/when/
延迟对象cho45: https://github.com/cho45/jsdeferred
学习实例:
whenJS的使用方法,来自蛐蛐的个人博客:https://www.imququ.com/post/promises-when-js.html
教你一步一步实现一个Promise:http://www.cnblogs.com/ygm125/p/3735677.html
百科:
promise规范A+: https://promisesaplus.com/
维基百科的promise/A规范说明:http://wiki.commonjs.org/wiki/Promises/A ,打开非常慢
维基百科的promise/B规范说明:http://wiki.commonjs.org/wiki/Promises/B ,打开也非常慢