我仍然试图使用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);
使用return deferred
时,我也尝试了return deferred.promise()
而不是when().then().then()
。
上面代码的jsFiddle:http://jsfiddle.net/eterpstra/yGu2d/
答案 0 :(得分:6)
由于jQuery 1.8 then()返回一个新的Promise(与pipe()相同),而不是返回when()返回时的延迟。
在您的示例中将jQuery版本更改为1.8.3或更高版本:
http://jsfiddle.net/eterpstra/yGu2d
和
$.when(testDefer("Hi")).then(there).then(guy);
会奏效。
答案 1 :(得分:5)
then()
和pipe()
适用于您的示例:
then()
返回延期,并在此相同 延期上调用then()
,您只需添加第二个回调即可它将与第一个
pipe()
会返回新 承诺,允许您构建一个链,这就是为什么您在此处获得顺序调用的原因情况下
有关管道/的更多信息,请查看以下资源:
When should I use jQuery deferred's "then" method and when should I use the "pipe" method?
答案 2 :(得分:2)
您正在以不应该使用的方式使用.then
- 在all that .then
expects is a plain function to be added as a callback时,您正在争论延迟它。
.then
方法返回已经解决的原始Deferred。当Deferred解析时,所有随.then
添加的回调都会立即执行。
另一方面,.pipe
函数接受一组函数或Promise(您正在发送它)并根据原始Deferred的状态进行解析。 .pipe
的功能实际上就是你要找的东西!