when then done await async javascript jquery jquery-deferred

javascript - done - jQuery: ¿Cuál es la diferencia entre deferred.always() y deferred.then()?



jquery deferred(); (4)

Me parece que ambos hacen lo mismo.

Docs:


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