等待第一多的jQuery Deferreds来解决?(Wait for the first of m

2019-06-27 02:23发布

使用jQuery我知道,我可以用$.when()等待所有 multipe Deferred s到解决。 (或者第一个被拒绝。)

但有一个简单的方法来火多的Deferred秒,然后静静等待第一个有待解决?

比如我想尝试用两个类似的AJAX Web服务无论是或可能是向下或慢,然后处理哪一个回复第一。 然后,我可能会使用第三Deferred超时。

Answer 1:

基于凯文·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 );


Answer 2:

一个快速简便的方法是放弃其他请求有两种颜色的时候之一,但你也可以检查推迟的状态,它的语法取决于你的jQuery版本,这就是为什么我和中止去了。

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


文章来源: Wait for the first of multiple jQuery Deferreds to be resolved?