example - jQuery Deferred vs jqXHR
jquery promise (2)
Aplazado está destinado a reemplazar jqXHR y abstrae la idea de éxito y error más allá de ajax.
Un rápido vistazo al código fuente: jQuery 1.6.1
// completeDeferred is resolved in only one place.
completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
deferred.promise( jqXHR ); // this attaches the promise methods to jqXHR
jqXHR.success = jqXHR.done;
jqXHR.error = jqXHR.fail;
jqXHR.complete = completeDeferred.done;
Hice una presentación de diapositivas de queso para trabajar sobre lo útil que es el diferido.
Yo suelo:
var jqXHR = $.ajax(settings);
jqXHR.success(function(result){});
jqXHR.error(function(result){});
jqXHR.complete(function(result){});
Pero la versión 1.5 ha añadido el objeto diferido.
P: En general, ¿cuándo utiliza el éxito, el error y los métodos completos en comparación con el nuevo grado de éxito diferido, hecho y fracaso?
Para $.ajax()
y family .success
es simplemente un sinónimo de Deferred''s .done
, y de la misma manera .error
es un sinónimo de .fail
.
Así que, de hecho, los ejemplos que muestra ya son métodos diferidos, pero con nombres diferentes.
.complete
es en su mayoría un sinónimo para el nuevo jQuery 1.6 .always
, y puede obtener el mismo efecto usando $.then(cb, cb)
, lo que hará que se invoque a cb
ya sea que la llamada AJAX tenga éxito o no. Creo que hay pequeñas diferencias en cuanto a los parámetros que se pasan a las devoluciones de llamada "fallidas" entre .complete
, .always
y $.then
variantes.
Personalmente prefiero usar la versión diferida de esas funciones nombradas, porque entonces no necesita preocuparse por si sus objetos diferidos son jqXHRs o no. Solo los jqXHRs
tienen .success
, .error
y .complete
, pero todos los aplazados (incluidos los jqXHR) tienen .done
, .fail
y .always
.
EDITAR Parece que los desarrolladores de jQuery están de acuerdo conmigo: han announced que .success
, .error
y .complete
quedarán obsoletos en jQuery 1.8