success
一直是jQuery中成功回調的傳統名稱,定義爲ajax調用中的一個選項。但是,自從執行$.Deferreds
以及更復雜的回調以來,done
是實現成功回調的首選方式,因爲它可以在任何deferred
上調用。
例如,成功:
$.ajax({
url: '/',
success: function(data) {}
});
例如,做到:
$.ajax({url: '/'}).done(function(data) {});
的好處約done
是,$.ajax
返回值現在是可以綁定到一個遞延承諾您應用程序中的任何其他位假設你想從幾個不同的地方進行這種Ajax調用。而不是將您的成功函數作爲ajax調用函數的選項傳遞,您可以讓函數本身返回$.ajax
並將您的回調函數與done
,fail
,then
或任何其他函數綁定。請注意,always
是一個回調,無論請求是成功還是失敗,都會運行。只有成功時纔會觸發done
。
例如:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json',
beforeSend: showLoadingImgFn
})
.always(function() {
// remove loading image maybe
})
.fail(function() {
// handle request failures
});
}
xhr_get('/index').done(function(data) {
// do stuff with index data
});
xhr_get('/id').done(function(data) {
// do stuff with id data
});
的這可維護性方面的一個重要的好處是,你已經包裹在一個應用程序特定功能的AJAX機制。如果您決定需要調用$.ajax
來調用以後的不同操作,或者使用不同的Ajax方法,或者您不再使用jQuery,則只需更改xhr_get
定義(確保返回承諾或至少返回done
方法,在上面的例子中)。整個應用中的所有其他參考可以保持不變。
還有更多(冷得多)的事情你可以做$.Deferred
,其中之一是使用pipe
觸發由服務器報告的錯誤失敗,即使$.ajax
請求本身成功。例如:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json'
})
.pipe(function(data) {
return data.responseCode != 200 ?
$.Deferred().reject(data) :
data;
})
.fail(function(data) {
if (data.responseCode)
console.log(data.responseCode);
});
}
xhr_get('/index').done(function(data) {
// will not run if json returned from ajax has responseCode other than 200
});
在這裏閱讀更多關於$.Deferred
:http://api.jquery.com/category/deferred-object/
注意:在jQuery 1.8,pipe
一直贊成以完全相同的方式使用then
的棄用。
我不知道如何定義'success:'/'.done()'的相互作用。例如。是'成功':這些日子剛剛實現爲第一個'.done()'? – 2012-01-12 19:15:53
你是說如果你在ajax調用中同時擁有'success:'和'.done'?好問題。由於所有其他回調函數都是按照它們綁定的順序調用的,所以我的猜測是肯定的,「成功」只是先調用。 – glortho 2012-01-12 19:24:44
是的,那的確會出現這種情況:http://jsfiddle.net/9L7dD/ – Adam 2014-04-19 14:35:28