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

ete*_*rps 7 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);?
Run Code Online (Sandbox Code Playgroud)

我也试过return deferred而不是return deferred.promise()在使用时when().then().then().

以上代码的jsFiddle:http://jsfiddle.net/eterpstra/yGu2d/

Ale*_*obo 6

因为jQuery 1.8 then()返回一个新的Promise(与pipe()相同),而不是返回when()返回时相同的Deferred.

在您的示例中将jQuery版本更改为1.8.3或更高版本:

http://jsfiddle.net/eterpstra/yGu2d

$.when(testDefer("Hi")).then(there).then(guy);

将工作.


max*_*xnk 5

这是您的样本中的工作方式then()pipe()工作方式:

then()收益递延,并通过调用then()这个相同的 延迟,你只需添加第二个回调也将被称为同时与第一个

pipe()相反,返回新的 Promise允许你构建一个链,这就是为什么你在这种情况下得到顺序调用


有关管道/然后的更多信息,请查看以下资源:

我何时应该使用jQuery deferred的"then"方法,何时应该使用"pipe"方法?

用JavaScript承诺管道