jQuery1.7系列三: jQuery延迟列表(Deferred)
?????????? 声明:写博客,是对自身知识的一种总结,也是一种分享,但由于作者本人水平有限,难免会有一些地方说得不对,还请大家友善? 指出,或致电:tianzhen.chen0509@gmail.com
???????????关注:国内开源jQuery-UI组件库:Operamasks-UI
?????? jQuery版本:v1.7.1
???????????????? jQuery1.7系列三:?jQuery延迟列表(Deferred)
一.函数列表
?
?????? 很多时候,我们想要执行一系列的函数,比如,当一个ajax请求后想要执行2个成功函数;当一个动画结束后想要执行2个函数,那么我们很容易想到用一个数组来承载这些待执行函数,如下所示:
jQuery.Callbacks便是它的实现,比如,看个最简单的代码:
可见,doneList和failList只可以触发一次,而progressList可以触发多次,而这个Deferred可以用来作啥?我们先来看段代码:
?
??????? 其实,Deferred的设计刚好用在ajax上,在进行ajax请求的时候,我们往往要添加成功和失败的回调处理,而且有时并不止一个,所以内部用了doneList和failList两个Callbacks,至于progressList是个比较特殊的东西,它相当于一个预处理的功能,在doneList和failList触发之前触发,而且必须由用户自己去触发它,所以一般我们不用在意它。
?
?????? 那么有了Deferred,ajax请求怎么调用那些回调就显而易见了,只要在ajax请求后根据状态判断是成功还是失败,然后选择触发doneList或者failList就行了,没什么其它稀奇的事。
?
?????? 最后再讲一下Deferred的promise方法,它是个挺好的概念来的,为了更好的理解它,我们回到上边的ajax实例。我们知道,doneList和failList应该由ajax内部来进行触发,而你拥有的功能仅仅是加入函数而已,毕竟只有ajax自己才知道请求成功还是失败了,那如果你拿到了上边的xhr变量后偏偏要自己去? xhr.fire(),不就可以破坏ajax的回调处理了?
?
????? 虽然我想作为一个正常的开发者没人会这样去做吧,但jQuery作者还是留了后招,上边虽然我注释到 xhr? 基本可以认为是一个Deferred,但严格上说并不完全是,它是调用了Deferred.promise()返回的一个弱Deferred,此Deferred弱的地方就在于它没有fire/fireWith这样的方法,所以jQuery作者想得还是蛮周到的吧,当你想用Deferred开发自己的东西时,也许也会利用到这一个方法的。
?
???? 总的说就是,Deferred.promise可以造出一个Deferred,但此Deferred只可以添加函数,不可以执行真正的触发。
?
四.最后的话
?
???????? jQuery的Deferred是一个设计挺巧妙的东西,如果你想实现自己的异步的队列,完全可以参考它的设计,关于所要掌握的一些概念,在上边都已经提到了,这只是一个初端,但对你进一步去了解它我觉得还是有好处的,特别是如果你想研究它的代码实现,有了这些知识,就不会觉得非常难以理解了。
?
?
五. 附录: Callbacks源码注释
?
?
?