由于1.7版本后$.Callbacks从Deferred中抽离出去了,目前版本的Deferred.js代码不过150行,而真正$.Deferred的实现只有100行左右,实现的逻辑是相当犀利的。
因为Callback被剥离出去后,整个Deferred就显得非常的精简,代码直接通过extend扩展到静态接口上,对于extend的继承这个东东,在之前就提及过jQuery如何处理内部jQuery与init相互引用this的问题,所以当jQuery.extend只有一个参数的时候,其实就是对jQuery静态方法的一个扩展。
jQuery.extend({ Deferred:function(func){ ...省略代码.... return deferred }, when:function(func){ ...省略代码.... return deferred.promise(); } })
我们来具体看看2个静态方法内部都干了些什么?
Deferred整体结构:右边代码所示。
Deferred就是一个简单的工厂方法,有两种方式使用:
var a = $.Deferred() $.Deferred(function(){})
内部其实是严重依赖$.Callbacks对象,Callbacks就是用来储存deferred依赖的数据的。
因为done、fail、progress就是jQuery.Callbacks("once memory")所有对应的处理:
var list = jQuery.Callbacks("once memory") promise['done'] = list.add;
deferred定义了一系列的接口,堪称一绝,100多行的代码,精练的有些过分。
Deferred方法内部建议了2个对象,一个是deferred外部接口对象,一个是内部promise对象。
promise对象解释是一个受限的对象, 这就是所谓的受限制的deferred对象,因为相比之前, 返回的deferred不再拥有resolve(With), reject(With), notify(With)这些能改变deferred对象状态并且执行callbacklist的方法了,只能是then、done、fali等方法。
其内部通过tuples数组,存储了所有的接口API,通过遍历把所有的接口一次都挂到内部promise与deferred对象上。
其中定义了done、fail以及progress这几个方法,其实就是Callbacks回调函数中的add方法,用与push外部的的数据,保存在队列上。
我们通过resolve、reject以及notify其实也就是处理Callbacks中的队列列表。
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报