首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

jQuery1.7系列3: jQuery延迟列表(Deferred)

2012-09-14 
jQuery1.7系列三:jQuery延迟列表(Deferred)?????????? 声明:写博客,是对自身知识的一种总结,也是一种分享,

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源码注释

?

?

?

热点排行