success
to tradycyjna nazwa wywołania zwrotnego powodzenia w jQuery, zdefiniowana jako opcja w wywołaniu ajax. Ponieważ jednak implementacja $.Deferreds
i bardziej wyrafinowane wywołania zwrotne done
jest 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ą done
jest to, że zwracana wartość $.ajax
jest 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 $.ajax
sam i powiązać wywołania zwrotne z done
, fail
, then
, czy cokolwiek innego. Pamiętaj, że always
jest to wywołanie zwrotne, które zostanie uruchomione niezależnie od tego, czy żądanie zakończy się powodzeniem, czy nie. done
zostaną 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 $.ajax
wywołanie działało w przyszłości inaczej, lub użyjesz innej metody ajax lub odejdziesz od jQuery, musisz tylko zmienić xhr_get
definicję (pamiętaj, aby zwrócić obietnicę lub przynajmniej done
metodę, 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 pipe
uruchomienie błędu zgłoszonego przez serwer błędu, nawet jeśli $.ajax
samo żą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 $.Deferred
tutaj: http://api.jquery.com/category/deferred-object/
UWAGA : Począwszy od jQuery 1.8, pipe
przestarzała na korzyść używania then
dokł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?