0

jQuery を使用すると、すべてのmultipeが解決される$.when()まで待機できることがわかります。(または、最初に拒否されたもの。)Deferred

しかし、複数の s を起動し、最初の sが解決されるのDeferredを待つ簡単な方法はありますか?

たとえば、2 つの同様の AJAX Web サービスを使用して、ダウンしているか遅いかのいずれかを使用してから、最初に応答した方を処理したいと考えています。そしてDeferred、タイムアウトに 3 分の 1 を使用するかもしれません。

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

.resolve()ただし、個別の完了関数を使用すると、内部的に分岐して.reject()、、、.resolveWith(...)または必要に応じて、一般的な形式のコールバックと.rejectWith(...)一緒に呼び出すことができます。masterDeferred

masterDeferred.then( doneCallbacks, failCallbacks );
于 2012-08-15T21:21:49.883 に答える
1

すばやく簡単な方法は、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);
});
于 2012-08-15T21:02:32.360 に答える