18

100回呼び出されるjQuery.ajax(async:true)を使用して、それらがすべてロードされているときに、システムが100回の呼び出しすべてが戻るのを待ってから続行する必要があるというページがあります。どうすればいいですか?

前もって感謝します!:)

アップデート:

これらの呼び出しはfor()ループで行われます(100個あります:))

4

5 に答える 5

36

これを行う良い方法は、を使用することです$.when。これは次のように使用できます。

$.when(
    $.ajax({/*settings*/}),
    $.ajax({/*settings*/}),
    $.ajax({/*settings*/}),
    $.ajax({/*settings*/}),
).then(function() {
    // when all AJAX requests are complete
});

または、配列にすべてのAJAX呼び出しがある場合は、次を使用できますapply

$.when.apply($, ajaxReqs);

これには少なくともjQuery1.5が必要であることに注意してください。


AJAXリクエストを配列に追加するには、次のようにします。

var ajaxReqs = [];
for (var i = 0; i < 100; i++) {
    ajaxReqs.push($.ajax({
        /* AJAX settings */
    });
}
$.when.apply($, ajaxReqs).then(function() {
    // all requests are complete
});
于 2011-06-06T09:35:41.997 に答える
4

この種の問題は、データベースSQL設計のいたるところに発生します。正確には同じではありませんが、問題はまさにネットワーク通信です。

正しく行わないと、噛み付くように戻ってくるので、注意する必要があります。つまり、ユーザーは待たなければならないことにひどくイライラします。これを十分に強調することはできません。

シナリオは次のとおりです。要求に応じて、サーバーから多くの小さな情報スニペットを転送したいとします。各リクエストは、効率的に動作するいくつかの要因によって異なります。これらはすべてあなたのコントロールの外にあります:

Wide area Network reposnse time (anywhere in the world right?)
Locak area Network reposnse time (anywhere in the building)
WebServer Load
WebServer Response time
Database response time
Backend Script run time
Javascript run time to process the result
The fact that the browsers are generally limited to 6-8 parallel AJAX requests at once (I think - someone correct me on the exact number)

これにリクエストを掛けます(えーと...あなたの場合はx 100)

写真をゲット?

ローカルマシンでのテストでは、問題なく機能する可能性があります。まったく同じマシンで独自のdbとWebサーバーを実行している場合もありますが、実際に試してみると、やがて信頼性の低下が問題になります。

聞いてください。単純な方法は、すべてのパラメーターを1つのJS配列にまとめて、それを1つのPOSTリクエストで送信することです。次に、サーバー上ですべてのデータベースが応答を選択し、1つのJSON/XML応答にロールアップします。

その時点で、AJAXの応答を1つだけ待っています。JSON/XMLの結果ですべてのデータを見つけることができます。

100のリクエストを処理しているとすると、ストップウォッチを使用して実際に時間の節約を測定できる可能性があります。

私からそれを取ってください-できるだけ少ないネットワーク要求をしてください。

于 2011-06-06T09:51:28.157 に答える
3

遅延オブジェクトAPIを使用できます。$ .ajaxが遅延オブジェクトを返す限り、次のコードを試してループを使用できます。

var ajaxes = [];
for (i = 1; i < 100; i++) {
  ajaxes[i] = $.ajax({/*data*/});
}

$.when.apply( ajaxes )
   .then(function(){
      console.log( 'I fire once all ajax requests have completed!' );
   })
   .fail(function(){
      console.log( 'I fire if one or more requests failed.' );
   });

PSjQuery1.5でDeferredを使用するEricHyndsによる遅延オブジェクトの使用に関するすばらしい記事があります

于 2011-06-06T09:36:40.610 に答える
2

100のAjax呼び出し?非常に奇妙な要件のようであり、達成しようとしていることは、別の方法を使用して達成できる可能性があります。

var i = 0;

関数myCallback(){
    alert('100回完了');
}

関数doAjax(){
    $ .ajax({
        url:'blah.php'、
        データ:'hello = world'、
        成功:function(response){
            i ++;
        }、
        完了:function(){
            if(i <100){
                doAjax();
            } そうしないと {
                myCallback();
            }
        }
    });
}

doAjax(); // 始める
于 2011-06-06T09:40:26.023 に答える
0

私はJSの人ではありませんが、グローバル変数を作成します。これがカウンターになり、このグローバル変数が100に達したかどうかを定期的にチェックする、時限関数を定義します。

編集:setTimeout()

于 2011-06-06T09:35:31.823 に答える