2011-06-08 28 views
17

我用:jQuery的遞延VS jqXHR

var jqXHR = $.ajax(settings); 
jqXHR.success(function(result){}); 
jqXHR.error(function(result){}); 
jqXHR.complete(function(result){}); 

但是1.5版本中加入了延期對象。問:一般來說,你什麼時候使用成功,錯誤和完整的方法,而不是延遲的新熱度,完成和失敗?

回答

17

對於$.ajax()和家庭.success僅僅是延遲的.done的代名詞,同樣.error.fail的代名詞。

所以實際上你展示的例子是已經延期的方法,但名稱不同。

.complete大多新的jQuery 1.6 .always的代名詞,你可以得到使用$.then(cb, cb)同樣的效果,這將導致cb要調用的AJAX調用成功與否。我相信在將參數傳遞給.complete,.always$.then變體之間的「失敗」回調函數時存在細微差異。

我個人更喜歡使用這些命名函數的Deferred版本,因爲那樣你就不用擔心延期的對象是否是jqXHRs。只有jqXHRs.success.error,並且.complete,但遞延(包括jqXHRs)具有.done.fail.always

編輯似乎jQuery的開發者同意我的看法 - 他們已經announced.success.error.complete將在jQuery的1.8

9

被棄用推遲是爲了取代jqXHR並提取成功和錯誤的想法超越阿賈克斯。

快速查看源代碼:jQuery的1.6.1

// completeDeferred is resolved in only one place. 
completeDeferred.resolveWith(callbackContext, [ jqXHR, statusText ]); 

deferred.promise(jqXHR); // this attaches the promise methods to jqXHR 
jqXHR.success = jqXHR.done; 
jqXHR.error = jqXHR.fail; 
jqXHR.complete = completeDeferred.done; 

我做了一個奶酪slide show工作有關如何延期是非常有用的。

+0

偉大的幻燈片放映和新的概念。如果您沒有jQuery,實現承諾/延期的最簡單方法是什麼? – huyz 2011-08-29 04:19:06

+0

簡單版本https://github.com/kriszyp/node-promise另一個包裝XHR請求的實現。 http://blogs.msdn.com/b/rbuckton/archive/2011/08/15/promise-js-2-0-promise-framework-for-javascript.aspx – gradbot 2011-08-29 10:21:47

+0

哇!這是一個偉大的幻燈片!感謝gradbot。 – 2011-11-08 23:48:56