我仍然试图围绕使用JQuery的Deferred对象,并且在一个特定问题上挠头。在下面的代码中,我最初试图连锁deferred.then()
,但它从来没有工作。所有三个功能一次执行。只有当我的同事指出我的pipe
功能后,情况才有所体现。问题是,为什么pipe()
工作,但不是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);
我使用when().then().then()
时也试过return deferred
而不是return deferred.promise()
。
的jsfiddle上面代码:http://jsfiddle.net/eterpstra/yGu2d/
小提琴对我使用“然后()。然后()”(铬)罚款。 – devundef
我理解它的方式,'.then'返回原来的延迟对象,允许其他的,完成,失败等等的调用。 '.pipe'过滤结果并可以返回一个新的延迟/承诺,并且链中任何后续的thens,dones失败都将作用于该对象而不是原始对象。 – MrOBrian
以上答案适用于Jquery 1.8及以下版本,请阅读下面的答案 –