Javascript 为什么$.when().pipe().then()有效,而$.when().then()无效?

Javascript 为什么$.when().pipe().then()有效,而$.when().then()无效?,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,我仍然在尝试使用JQuery的延迟对象来解决我的问题,并且在一个特定的问题上绞尽脑汁。在下面的代码中,我最初尝试链接deferred.then(),但从未奏效。这三个函数同时执行。直到我的同事给我指了指管道功能后,事情才有了眉目。问题是,为什么pipe()有效,而then()无效 var otherDefer=function(msg){return function(){return testDefer(msg)}; var there=otherDefer(“there”); var guy

我仍然在尝试使用JQuery的延迟对象来解决我的问题,并且在一个特定的问题上绞尽脑汁。在下面的代码中,我最初尝试链接
deferred.then()
,但从未奏效。这三个函数同时执行。直到我的同事给我指了指
管道
功能后,事情才有了眉目。问题是,为什么
pipe()
有效,而
then()
无效

var otherDefer=function(msg){return function(){return testDefer(msg)};
var there=otherDefer(“there”);
var guy=otherDefer(“guy”);
函数testDefer(msg){
var deferred=$.deferred();
调用(函数(){
$(“
  • ”+msg+”
  • )。附录(“#msgOut”); 延迟。解决(); }); 延迟返回。承诺(); } 函数调用(回调){ setTimeout(回调,1500); } $.when(testDefer(“Hi”)).pipe(那里)。然后(guy);​
    在使用
    when().then().then()
    时,我也尝试了
    return deferred
    而不是
    return deferred.promise()


    上述代码的JSIDLE:

    您正在使用
    。然后以一种不应该使用它的方式使用它--
    ,您正在争论一个延迟到它的时间

    。然后
    方法返回已解决的原始延迟值。当延迟解析时,所有添加了
    的回调将立即执行

    另一方面,
    .pipe
    函数接受一组函数或一个承诺(即您正在发送的承诺),并根据原始文件的状态进行解析。
    .pipe
    的功能实际上就是您要寻找的

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

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

    pipe()
    ,而是返回newPromise,允许您构建链,这就是为什么在这种情况下会得到顺序调用


    请参阅以下参考资料,了解有关管道/然后的更多信息:

    因为jQuery 1.8 then()返回一个新的承诺(与pipe()相同),而不是when()返回的延迟承诺

    将示例中的jQuery版本更改为1.8.3或更高版本,网址为:

    $.when(testDefer(“Hi”))。然后(那里)。然后(guy)


    将起作用。

    使用“then().then()”(Chrome)小提琴对我来说很好。我理解它,
    。然后
    返回原始的延迟对象,允许对它进行其他then、done、fail等调用
    .pipe
    过滤结果,可以返回一个新的延迟/承诺,链中任何后续的延迟/承诺、完成或失败都将作用于该对象,而不是原始对象。上述答案适用于Jquery 1.8及以下版本,如下所述回答“JavaScript中的承诺管道”文章非常有用。谢谢当时有人问这个问题,这可能就是为什么以前的答案都不建议更新。不过,对于未来面临此问题的用户,最好有一个更新,这样他们就不会在新代码中开始使用不推荐的函数。
    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);​