javascript - done - jQuery: ¿Cuál es la diferencia entre deferred.always() y deferred.then()?
Antes de jQuery 1.8: .always(fn)
es equivalente a .then(fn, fn)
A partir de jQuery 1.8: .always(fn)
es similar a .then(fn, fn)
pero difiere en lo que se devuelve (consulte deferred.then() para obtener más información)
Con .then()
puede proporcionar una devolución de llamada individual para cuando $.Deferred
se resuelve (se done
), y otra para cuando $.Deferred
se rechaza ( fail
).
.always()
, por otro lado, le permite proporcionar una devolución de llamada que siempre se ejecuta, ya $.Deferred
se haya resuelto o rechazado el $.Deferred
. En otras palabras, dentro de esta devolución de llamada, no importa si la llamada AJAX ha fallado o se ha ejecutado con éxito.
.always()
a poner el código en .always()
cuando quiero que el código se ejecute cada vez, e independientemente de si el $.Deferred
se resolvió con éxito o no. Por ejemplo, para borrar un indicador de carga AJAX o para ocultar una barra de progreso. Usando .then()
tendrías algo como esto:
$.get("/some/url").then(function () { // done callback
$(".progress-bar").hide();
}, function () { // fail callback
$(".progress-bar").hide();
});
Si bien si usó .always()
, solo necesitaría una devolución de llamada, ya que siempre desea ocultar la barra de progreso, sin importar si el $.Deferred
se resolvió o rechazó:
$.get("/some/url").always(function () {
$(".progress-bar").hide();
});
El gran beneficio de then
(a partir de 1.8) es la capacidad de encadenar tareas explícitamente porque devuelve una promesa que se resolverá con el resultado de la devolución de llamadas.
Ejemplo de documentación:
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
});
Parecería que deferred.then()
permite pasar dos devoluciones de llamada separadas para el éxito y el fracaso, mientras que deferred.always()
toma un número n
de devoluciones de llamada que se llamarán independientemente del resultado del evento inicial.
Yo diría que use deferred.always()
en los casos en que el éxito / fracaso del evento inicial no sea importante