successto tradycyjna nazwa wywołania zwrotnego powodzenia w jQuery, zdefiniowana jako opcja w wywołaniu ajax. Ponieważ jednak implementacja $.Deferredsi bardziej wyrafinowane wywołania zwrotne donejest preferowanym sposobem realizacji wywołań zwrotnych powodzenia, ponieważ można je wywołać w dowolnym deferred.
Na przykład sukces:
$.ajax({
url: '/',
success: function(data) {}
});
Na przykład zrobione:
$.ajax({url: '/'}).done(function(data) {});
Zaletą donejest to, że zwracana wartość $.ajaxjest teraz odroczoną obietnicą, którą można powiązać z dowolnym innym miejscem w aplikacji. Powiedzmy, że chcesz wykonać to wywołanie ajax z kilku różnych miejsc. Zamiast przechodzącą w funkcji sukcesu jako opcja do funkcji sprawia, że ten ajax połączeń, można po prostu mieć powrotu funkcji $.ajaxsam i powiązać wywołania zwrotne z done, fail, then, czy cokolwiek innego. Pamiętaj, że alwaysjest to wywołanie zwrotne, które zostanie uruchomione niezależnie od tego, czy żądanie zakończy się powodzeniem, czy nie. donezostaną uruchomione tylko w przypadku sukcesu.
Na przykład:
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
});
Ważną korzyścią z punktu widzenia łatwości konserwacji jest to, że mechanizm ajax został zawinięty w funkcję specyficzną dla aplikacji. Jeśli zdecydujesz, że chcesz, aby Twoje $.ajaxwywołanie działało w przyszłości inaczej, lub użyjesz innej metody ajax lub odejdziesz od jQuery, musisz tylko zmienić xhr_getdefinicję (pamiętaj, aby zwrócić obietnicę lub przynajmniej donemetodę, w przypadek z powyższego przykładu). Wszystkie pozostałe odniesienia w aplikacji mogą pozostać takie same.
Jest o wiele więcej (znacznie fajniejszych) rzeczy, które możesz zrobić $.Deferred, z których jednym jest pipeuruchomienie błędu zgłoszonego przez serwer błędu, nawet jeśli $.ajaxsamo żądanie się powiedzie. Na przykład:
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
});
Przeczytaj więcej o $.Deferredtutaj: http://api.jquery.com/category/deferred-object/
UWAGA : Począwszy od jQuery 1.8, pipeprzestarzała na korzyść używania thendokładnie w ten sam sposób.
success:/.done(), jeśli w ogóle. Np. Czysuccess:właśnie został wdrożony jako pierwszy w.done()tych dniach?