Javascript 为什么$.when().pipe().then()有效,而$.when().then()无效?
我仍然在尝试使用JQuery的延迟对象来解决我的问题,并且在一个特定的问题上绞尽脑汁。在下面的代码中,我最初尝试链接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
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);