Wydaje mi się, że oboje robi to samo.

Dokumenty:

26
Niyaz 16 wrzesień 2012, 19:29

4 odpowiedzi

Najlepsza odpowiedź

Wydawałoby się, że deferred.then() pozwala przejść dwa oddzielne wywołania zwrotne dla sukcesu i awarii, podczas gdy deferred.always() wymaga n Liczba wywołania zwrotnych, które zostaną wywołane niezależnie od wyniku zdarzenia początkowego.

Powiedziałbym, że użyj deferred.always() w przypadkach, w których sukces / awaria początkowego wydarzenia nie jest ważna

33
JamesHalsall 16 wrzesień 2012, 15:33

Z .then() można dostarczyć indywidualne wywołanie zwrotne, gdy zostanie rozwiązany [{X1}}) (done) i inny , gdy $.Deferred zostanie odrzucony ( fail).

Z drugiej strony {{X0} Innymi słowy, w tym wywołaniu zwrotnym, nie ma znaczenia, czy połączenie AJAX nie powiodło się lub został pomyślnie wykonany.

Mam tendencję do umieszczania kodu w .always(), gdy chcę, aby ten kod był uruchomiony za każdym razem, a niezależnie od tego, czy $.Deferred został rozwiązany pomyślnie, czy nie. Na przykład, aby usunąć wskaźnik ładowania AJAX lub ukryć pasek postępu. Używanie .then() Masz coś takiego:

$.get("/some/url").then(function () { // done callback
  $(".progress-bar").hide();
}, function () { // fail callback
  $(".progress-bar").hide();
});

Podczas gdy użyłeś .always(), potrzebujesz tylko jednego wywołania zwrotnego, ponieważ zawsze chcesz ukryć pasek postępu, bez względu na to, czy $.Deferred została rozwiązana lub odrzucona:

$.get("/some/url").always(function () {
  $(".progress-bar").hide();
});
7
João Silva 16 wrzesień 2012, 15:39

Przed jQuery 1.8: .always(fn) jest równoważny .then(fn, fn)

Od JQuery 1.8: {X0}} jest podobny do .then(fn, fn), ale różni się w tym, co jest zwracane (patrz http://api.jquery.com/deferred.then/ Szczegóły)

6
Ignitor 18 czerwiec 2013, 08:15

Duża korzyść z then (od 1,8) jest możliwość jawnej zdolności do zadań łańcuchowych, ponieważ zwraca obietnicę, która zostanie rozwiązana z wynikiem zwrotów zwrotnych

Przykład z dokumentacji:

var request = $.ajax( url, { dataType: "json" } ),
    chained = request.then(function( data ) {
      return $.ajax( url2, { data: { user: data.userId } } );
    });

chained.done(function( data ) {
  // data retrieved from url2 as provided by the first request
});
0
schlamar 2 lipiec 2013, 14:19