使用 jQuery,我知道我可以$.when()
用来等待所有multipeDeferred
被解析。(或者第一个被拒绝。)
但是有没有一种简单的方法来触发多个Deferred
s 然后等待第一个被解决?
例如,我想尝试使用两个类似的 AJAX Web 服务,或者它们可能会出现故障或速度慢,然后处理首先回复的任何一个。然后我可能会使用第三Deferred
个超时。
使用 jQuery,我知道我可以$.when()
用来等待所有multipeDeferred
被解析。(或者第一个被拒绝。)
但是有没有一种简单的方法来触发多个Deferred
s 然后等待第一个被解决?
例如,我想尝试使用两个类似的 AJAX Web 服务,或者它们可能会出现故障或速度慢,然后处理首先回复的任何一个。然后我可能会使用第三Deferred
个超时。
基于 Kevin B 的代码,这是一种使用主 Deferred 对象的方法:
var masterDeferred = new $.Deferred(),
reqOne = $.post("foo.php"),
reqTwo = $.post("bar.php");
masterDeferred.done(function() {
// do stuff
});
reqOne.done(function() {
masterDeferred.resolve();
});
reqTwo.done(function() {
masterDeferred.resolve();
});
我想我说得对,解决 masterDeferred 的最简单形式是:
reqOne.done(masterDeferred.resolve);
reqTwo.done(masterDeferred.resolve);
但是单独的 done 函数将允许您在内部分支并调用.resolve()
,.reject()
或酌情.resolveWith(...)
与一般形式的回调.rejectWith(...)
一起:masterDeferred
masterDeferred.then( doneCallbacks, failCallbacks );
一种快速简便的方法是在两个请求之一完成时中止另一个请求,尽管您也可以检查延迟的状态,其语法将取决于您的 jQuery 版本,这就是我现在使用 abort 的原因。
function doStuff(data) {
alert( "Hello World!" );
}
var reqOne = $.post("foo.php"),
reqTwo = $.post("bar.php");
reqOne.done(function(data){
reqTwo.abort();
finished = true;
doStuff(data);
});
reqTwo.done(function(data){
reqOne.abort();
finished = true;
doStuff(data);
});