等待多个jQuery Deferred中的第一个被解决?

时间:2012-08-15 20:59:26

标签: jquery jquery-deferred

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

但有没有一种简单的方法可以解雇多个Deferred,然后等待第一个被解析?

例如,我想尝试使用两个类似的AJAX Web服务,或者可能会停机或缓慢,然后处理先回复的任何一个。然后我可能会使用第三个Deferred来暂停。

2 个答案:

答案 0 :(得分:2)

基于Kevin B的代码,这是一种使用主延迟对象的方法:

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);

但是,单独的已完成功能将允许您在内部进行分支并根据需要调用.resolve().reject().resolveWith(...).rejectWith(...)以及masterDeferred回调一般形式:

masterDeferred.then( doneCallbacks, failCallbacks );

答案 1 :(得分: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);
});