一、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