今天為大家介紹的是jQuery Deferred對象介紹,希望大家會喜歡。
$.Deferred的實現
創建三個$.Callbacks對象,分別表示成功,失敗,處理中三種狀態
創建了一個promise對象,具有state、always、then、primise方法
通過擴展primise對象生成最終的Deferred對象,返回該對象
$.when的實現
接受若干個對象,參數僅一個且非Deferred對象將立即執行回調函數
Deferred對象和非Deferred對象混雜時,對於非Deferred對象remaining減1
Deferred對象總數 = 內部構建的Deferred對象 + 所傳參數中包含的Deferred對象
所傳參數中所有Deferred對象每當resolve時remaining減1,直到為0時(所有都resolve)執行回調
這就是$.Deferred和$.when的全部了,各個方法及使用稍後介紹。
代碼閱讀中會發現then和when方法的實現最難理解,看多次,後感回味無窮,非常巧妙。then內部會用到不同尋常的遞歸,when用到了計數,每次異步成功後減一,直到為0後表示全部異步操作成功,這時才可執行回調。
上面提到Deferred裡有3個$.Callbacks的實例,Deferred自身則圍繞這三個對象進行更高層次的抽象。以下是Deferred對象的核心方法
done/fail/progress 是 callbacks.add,將回調函數存入
resolve/reject/notify 是 callbacks.fire,執行回調函數(或隊列)
下面舉一些示例看看如何使用Deferred對象。
一、done/resolve
function cb() {
alert('success')
}
var deferred = $.Deferred()
deferred.done(cb)
setTimeout(function() {
deferred.resolve()
}, 3000)
在HTTP中表示後台返回成功狀態(如200)時使用,即請求成功後可執行成功回調函數。
二、fail/reject
function cb() {
alert('fail')
}
var deferred = $.Deferred()
deferred.fail(cb)
setTimeout(function() {
deferred.reject()
}, 3000)
在HTTP中表示後台返回非成功狀態時使用,即請求失敗後可執行失敗回調函數。
三、progress/notify
function cb() {
alert('progress')
}
var deferred = $.Deferred()
deferred.progress(cb)
setInterval(function() {
deferred.notify()
}, 2000)
在HTTP中表示請求過程中使用,即請求過程中不斷執行回調函數。這可用在文件上傳時的loading百分比或進度條。
以上就是我們為大家准備的jQuery Deferred對象介紹的相關內容,希望對大家可以有所幫助。