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?success:
i.done
jedno wywołanie ajax? Dobre pytanie. Ponieważ wszystkie inne wywołania zwrotne są wywoływane w kolejności, w jakiej są powiązane, domyślam się, że tak,success
jest wywoływane jako pierwsze.pipe
jest taki, w którym samo żądanie się powiedzie, ale skrypt na serwerze nie zwrócił tego, czego szukałeś. Możesz nie chcieć rzucić rzeczywistej liczby 404 lub 500 po stronie serwera, ponieważ chcesz znacząco rozróżnić odpowiedzi HTTP od odpowiedzi aplikacji. Ustawienie kodu odpowiedzi w JSON, a następnie użycie wpipe
ten sposób pozwala obsługiwać różnego rodzaju błędy z większym niuansami.Jeśli potrzebujesz
async: false
w swoim ajax, powinieneś użyćsuccess
zamiast.done
. W przeciwnym razie lepiej użyć.done
. To jest z oficjalnej strony jQuery :źródło
async:false
?$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
Obiekty jqXHR zwrócone przez
$.ajax()
jQuery 1.5 implementują interfejs Obietnicy, nadając im wszystkie właściwości, metody i zachowanie Obietnicy (zobacz Odroczony obiekt, aby uzyskać więcej informacji). Te metody pobierają jeden lub więcej argumentów funkcji, które są wywoływane po$.ajax()
zakończeniu żądania. Umożliwia to przypisanie wielu wywołań zwrotnych do pojedynczego żądania, a nawet przypisanie wywołań zwrotnych po zakończeniu żądania. (Jeśli żądanie jest już ukończone, wywołanie zwrotne jest natychmiast uruchamiane.) Dostępne metody promise obiektu jqXHR obejmują:Alternatywna konstrukcja do opcji wywołania zwrotnego powodzenia, patrz
deferred.done()
szczegóły implementacji.Alternatywna konstrukcja dla opcji wywołania zwrotnego błędu,
.fail()
metoda zastępuje przestarzałą metodę .error (). Szczegółowe informacje dotyczące implementacji można znaleźć w deferred.fail ().(dodano w jQuery 1.6) Alternatywna konstrukcja do pełnej opcji wywołania zwrotnego,
.always()
metoda zastępuje przestarzałą.complete()
metodę.W odpowiedzi na pomyślne żądanie argumenty funkcji są takie same jak argumenty
.done()
: data, textStatus i obiektu jqXHR. W przypadku nieudanych żądań argumenty są takie same jak w przypadku.fail()
: obiektu jqXHR, textStatus i errorThrown. Zobaczdeferred.always()
szczegóły implementacji.Zawiera funkcjonalność
.done()
i.fail()
metod, umożliwiając (od jQuery 1.8) manipulowanie leżącą u podstaw obietnicą. Szczegółowe informacje.then()
na temat implementacji można znaleźć w części odroczonej .źródło