2012-09-04 61 views
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);​ 

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

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

+0

小提琴对我使用“然后()。然后()”(铬)罚款。 – devundef

+0

我理解它的方式,'.then'返回原来的延迟对象,允许其他的,完成,失败等等的调用。 '.pipe'过滤结果并可以返回一个新的延迟/承诺,并且链中任何后续的thens,dones失败都将作用于该对象而不是原始对象。 – MrOBrian

+0

以上答案适用于Jquery 1.8及以下版本,请阅读下面的答案 –

回答

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

+0

'承诺管道在JavaScript'文章是超级有用的。谢谢! – eterps

2

你在它不应该被使用的方式使用.then - you're一个争论推迟到它,当all that .then expects is a plain function to be added as a callback

.then方法返回已经解决的原始Deferred。当延期结算时,立即执行添加了.then的所有回调。

另一方面,.pipe函数采用一组函数或一个Promise(这就是你发送的)并根据原始Deferred的状态来解析。 .pipe的功能实际上就是您要找的!

6

由于jQuery 1.8 then()返回一个新的Promise(与pipe()相同)代替当()返回时的延迟。

更改jQuery的版本1.8.3或以上,你的例子在:

http://jsfiddle.net/eterpstra/yGu2d

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

会工作。

+0

在问这个问题的时候,[jQuery 1.8还是相当新](http://blog.jquery.com/2012/08/09/jquery-1-8-released/),这可能是为什么没有较旧的答案建议更新。尽管如此,为面临此问题的未来用户进行更新还是很好的,所以他们不会在新代码中使用已弃用的函数。 –

相关问题