使用jQuery我知道我可以使用$.when()
等待所有多字Deferred
来解析。 (或者第一个被拒绝。)
但有没有一种简单的方法可以解雇多个Deferred
,然后等待第一个被解析?
例如,我想尝试使用两个类似的AJAX Web服务,或者可能会停机或缓慢,然后处理先回复的任何一个。然后我可能会使用第三个Deferred
来暂停。
答案 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);
});