Todavía estoy tratando de entender lo que sucede con los objetos Deferred de JQuery, y me estoy rascando la cabeza ante un problema en particular. En el siguiente código, inicialmente intenté encadenar deferred.then()
pero nunca funcionó. Las tres funciones se ejecutan a la vez. Solo después de que mi compañero de trabajo me indicara la función pipe
, las cosas se pusieron en su lugar. La pregunta es, ¿por qué funciona pipe()
, pero no then()
?
var otherDefer = function(msg){return function(){return testDefer(msg)}};
var there = otherDefer("there,");
var guy = otherDefer("guy.");
function testDefer(msg) {
var deferred = $.Deferred();
pretendAjaxCall(function() {
$('<li>'+msg+'</li>').appendTo('#msgOut');
deferred.resolve();
});
return deferred.promise();
}
function pretendAjaxCall(callback) {
setTimeout(callback,1500);
}
$.when(testDefer("Hi")).pipe(there).then(guy);
También probé return deferred
return deferred.promise()
en lugar de cuando se utiliza when().then().then()
.
jsFiddle de código anterior: http://jsfiddle.net/eterpstra/yGu2d/
El violín funciona bien para mí usando "then(). Then()" (Chrome). – devundef
de la forma en que lo entiendo, '.then' devuelve el objeto diferido original, lo que permite otras llamadas que luego, hecho, fallido, etc. '.pipe' filtra el resultado y puede devolver una nueva promesa/diferida y cualquier función posterior, dones, falla en la cadena actuará sobre ese objeto en lugar del original. – MrOBrian
esta respuesta anterior es para Jquery 1.8 y siguientes, lea a continuación las respuestas –