一、jquery源码中Deferred的定义
jQuery.extend({
Deferred: function( func ) {
var tuples = [
// action, add listener, listener list, final state
[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
[ "notify", "progress", jQuery.Callbacks("memory") ]
],
...
// All done!
return deferred;
},
// Deferred helper
when: function( subordinate /**//* , , subordinateN */ ) {
var i = 0,
resolveValues = core_slice.call( arguments ),
length = resolveValues.length,
...
return deferred.promise();
}
});
二、Deferred定义的说明
1、$.Deferred的实现
(1)、创建三个$.Callbacks对象,分别表示成功,失败,处理中三种状态
(2)、创建了一个promise对象,具有state、always、then、primise方法
(3)、通过扩展primise对象生成最终的Deferred对象,返回该对象
2、$.when的实现
(1)、接受若干个对象,参数仅一个且非Deferred对象将立即执行回调函数
(2)、Deferred对象和非Deferred对象混杂时,对于非Deferred对象remaining减1
(3)、Deferred对象总数 = 内部构建的Deferred对象 + 所传参数中包含的Deferred对象
(4)、所传参数中所有Deferred对象每当resolve时remaining减1,直到为0时(所有都resolve)执行回调
参考资料 : jquery源码中Deferred的定义的理解 http://www.studyofnet.com/news/1223.html