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?

 280
Author: Claudio, 2012-01-12

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.

 422
Author: glortho,
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 () .

 3
Author: AmirHossein Manian,
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