为什么$ .when()。pipe()。then()工作,但不是$ .when()。then()。then()?

时间:2012-09-04 22:11:19

标签: javascript jquery jquery-deferred

我仍然试图使用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/

3 个答案:

答案 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?

Promise Pipelines in JavaScript

答案 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的功能实际上就是你要找的东西!