0

使用 jQuery,我知道我可以$.when()用来等待所有multipeDeferred被解析。(或者第一个被拒绝。)

但是有没有一种简单的方法来触发多个Deferreds 然后等待第一个被解决?

例如,我想尝试使用两个类似的 AJAX Web 服务,或者它们可能会出现故障或速度慢,然后处理首先回复的任何一个。然后我可能会使用第三Deferred个超时。

4

2 回答 2

2

基于 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 );
于 2012-08-15T21:21:49.883 回答
1

一种快速简便的方法是在两个请求之一完成时中止另一个请求,尽管您也可以检查延迟的状态,其语法将取决于您的 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);
});
于 2012-08-15T21:02:32.360 回答