6

Javascript では、データに対する 2 つの非同期要求があります。

$.getJSON('http://foo.com', fooQuery, fooSuccess(data));
$.getJSON('http://bar.com', barQuery, barSuccess(data));

受信したデータを処理するための 2 つのコールバック:

fooSuccess(data) { // Stuff }
barSuccess(data) { // More Stuff }

fooSuccess の完了後にのみ barSuccess が実行されるようにするにはどうすればよいですか?

ノート:

  • データ要求をそのままにしておきたい: 非同期でノンブロッキング (サーバーの応答に時間がかかる場合があるため)。
  • でも、データを処理するコールバックはシーケンシャルに実行したい。つまり、fooSuccess が完了するまでは barSuccess を実行したくありません。

あなたの知恵と助けに感謝します!

4

4 に答える 4

5

ajax リクエストによって返される jQuery 遅延オブジェクトを使用してそれを行う方法を次に示します。

var fooDfd = $.getJSON('http://foo.com', fooQuery);
var barDfd = $.getJSON('http://bar.com', barQuery);

fooDfd.then(function(fooData){
    fooSuccess(fooData);
    barDfd.then(barSuccess);
});

</p>

于 2012-12-28T00:53:41.093 に答える
5

最善の方法は、次のような jQuerywhen().done()機能を利用することです。

$.when(
    $.getJSON('http://foo.com', fooQuery, fooSuccess(data)), 
    $.getJSON('http://bar.com', barQuery, barSuccess(data))
).done(function(arg1, arg2){
    fooSuccess(arg1);
    barSuccess(arg2);
});

これにより、AJAX リクエストの同時実行が可能になり、done()すべてのリクエストが正常に完了すると関数の実行が保証されます。

于 2012-12-28T00:55:03.360 に答える
1

30分前のこの非常に興味深い投稿をフォローしています.@Mike Brantが提示したエレガントなソリューションが表示されたとき、私はすぐにjqueryライブラリに飛び込んで魔法がどのように作られているかを確認しました. そうでしょう?私はお勧めします、とても面白いです!ところで、私たちはそのすべての魔法を必要としないと思います。この場合ではなく、2 つの非同期呼び出しハンドラー (関数) があり、どちらが最初に終了するかに関係なく、2 番目の終了を知る必要があり、必要なのは 3 番目の関数だけです。これは 2 つのハンドラーによって呼び出され、すべてのデータの準備が整ったときに動作します。このアプローチは、洗練された jquery ソリューションよりも 4 ~ 5 行多くのコードを必要とすることはわかっていますが、最終的には私たちの脳と魂はより良い状態になります。申し訳ありませんが私の英語。

于 2012-12-28T01:46:02.337 に答える
-1

barSuccess呼び出しをfooSuccess成功のコールバックに入れます。

fooSuccess(data){
  jQuery.ajax({
    data: data,
    success: function(response){
      barSuccess(data) //should still be in scope, I think?
    }
  }
}
于 2012-12-28T00:40:49.797 に答える