jQuery.obsługa ajax Kontynuuj odpowiedzi: "sukces: "vs".zrobione"?
Pracuję z jQuery i AJAX od kilku tygodni i widziałem dwa różne sposoby "kontynuowania" skryptu po wywołaniu: success:
i .done
.
Z podsumowania z jQuery documentation otrzymujemy:
.done (): opis: dodaje procedury obsługi, które mają być wywołane, gdy obiekt odroczony zostanie rozwiązany.
Sukces: (.opcja ajax ()): funkcja, która zostanie wywołana, jeśli żądanie się powiedzie.
Więc obaj coś robią po Ajaxie połączenie zostało zakończone/rozwiązane. Czy mogę użyć jednego lub drugiego losowo? Jaka jest różnica i kiedy jeden jest używany zamiast drugiego?
2 answers
success
jest tradycyjną nazwą wywołania zwrotnego sukcesu w jQuery, zdefiniowanego jako opcja w wywołaniu ajax. Jednak, ponieważ implementacja $.Deferreds
i bardziej wyrafinowanych wywołań zwrotnych, done
jest preferowanym sposobem implementacji wywołań zwrotnych, ponieważ może być wywołana na dowolnym deferred
.
Na przykład sukces:
$.ajax({
url: '/',
success: function(data) {}
});
Na przykład:
$.ajax({url: '/'}).done(function(data) {});
Fajną rzeczą w done
jest to, że wartość zwracana $.ajax
jest teraz odroczoną obietnicą, którą można wiązać wszędzie inne w aplikacji. Więc powiedzmy, że chcesz wykonać ten telefon ajax z kilku różnych miejsc. Zamiast przekazywać funkcję sukcesu jako opcję do funkcji, która wykonuje to wywołanie ajax, możesz po prostu mieć funkcję return $.ajax
i powiązać wywołania zwrotne z done
, fail
, then
, albo cokolwiek. Zauważ, że {[14] } jest wywołaniem zwrotnym, które będzie uruchamiane niezależnie od tego, czy żądanie powiedzie się, czy nie. done
zostanie uruchomiony tylko po sukcesie.
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
});
An ważną zaletą tego pod względem łatwości konserwacji jest to, że zawijałeś swój mechanizm ajax w funkcję specyficzną dla aplikacji. Jeśli zdecydujesz, że Twoje wywołanie $.ajax
będzie działać inaczej w przyszłości, lub użyjesz innej metody ajax, lub odejdziesz od jQuery, musisz tylko zmienić definicję xhr_get
(pamiętaj, aby zwrócić obietnicę lub przynajmniej metodę done
, W przypadku powyższego przykładu). Wszystkie inne odniesienia w całej aplikacji mogą pozostać to samo.
Istnieje wiele innych (znacznie fajniejszych) rzeczy, które możesz zrobić z $.Deferred
, z których jedną jest użycie pipe
do wywołania błędu zgłoszonego przez serwer, nawet jeśli samo żądanie $.ajax
powiedzie się. 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
});
Czytaj więcej o $.Deferred
tutaj: http://api.jquery.com/category/deferred-object/
Uwaga : od wersji jQuery 1.8, pipe
został wycofany na rzecz używania then
W dokładnie taki sam sposób.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 14:11:12
Jeśli potrzebujesz async: false
w Ajaxie, powinieneś użyć success
zamiast .done
. W przeciwnym razie lepiej użyć .done
.
To jest z jQuery official site :
W jQuery 1.8, użycie async: false z jqxhr ($.Deferred) jest przestarzały; musisz użyć opcji callback success/error/complete zamiast odpowiednich metod obiektu jqXHR, takich jak jqXHR.done () .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-17 11:14:16