7

我仍在尝试使用 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/

4

3 回答 3

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);

将工作。

于 2013-07-12T18:32:57.567 回答
5

这是您的示例中的工作方式then()和工作方式:pipe()

then()返回Deferred并通过调用then()一个 Deferred,您只需向它添加第二个回调,它将与第一个同时调用

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


查看以下资源以获取有关 pipe/then 的更多信息:

什么时候应该使用 jQuery deferred 的“then”方法,什么时候应该使用“pipe”方法?

JavaScript 中的 Promise 管道

于 2012-09-05T00:09:51.150 回答
2

您正在.then以一种不应该使用的方式使用它——您正在为它争论一个 Deferred ,而所有.then期望只是一个简单的函数作为回调添加

.then方法返回已解决的原始 Deferred。当 Deferred 解决时,所有添加的回调都会.then立即执行。

另一方面,该.pipe函数采用一组函数或一个 Promise(这是您发送的内容),并根据原始 Deferred 的状态进行解析。的功能.pipe实际上是您正在寻找的!

于 2012-09-05T00:07:12.513 回答