15

そのため、起動したい一連の AJAX イベントがありますが、同時リクエストの数を 5 に制限し、残りをキューに入れたいと考えています。たとえば、次のようなものがあります。

 $("div.server").each(function() {
     $.ajax(....);
 });

そのため、 class には 100 の div が存在する可能性がありますserverが、一度に 5 つのリクエストのみを実行したいと考えています。リクエストが完了すると、次のリクエストに進む必要があります。

これを行う最善の方法は何ですか?

4

3 に答える 3

6

これを行う最善の方法は、ブラウザに処理させることです。通常、ブラウザーにはホストごとの接続制限が既に設定されているため、接続が多すぎる場合は自動的に接続をキューに入れます。

ただし、複数の要素から日付を取得し、複数の要素のデータを返すように API を変更することを検討します。つまり、必要な HTTP 要求の総数を減らします。

于 2012-04-23T07:56:52.980 に答える
5

queueRequest関数 calledおよび callを使用して、すべてのリクエスト引数をキューにプッシュしますcheckQueuecheckQueueキューにアイテムがあるかどうか、およびアクティブなリクエストの数が 5 未満かどうかを確認します。これらの条件が満たされている場合、キューからリクエストをポップし、それを実際の AJAX リクエストに変換します。done次に、アクティブなリクエスト数を減らし、 を呼び出すハンドラをリクエストにアタッチしますcheckQueue

于 2012-04-23T07:57:54.767 に答える
2

リクエストをキューに入れる際のブラウザーの機能についてまだ不明な場合は、次のようなことを試すことができます。

var count = 0;          // Number of functions being called
var funcArray = [];     // Array of functions waiting
var MAX_REQUESTS = 5;   // Max requests
var CALL_WAIT = 100;        // 100ms

function call()
{
    // Check if count doesn't exceeds or if there aren't any functions to call
    if(count >= MAX_REQUESTS || funcArray.length == 0)
        // Call call() after 100ms
        setTimeout(function() { call() }, CALL_WAIT);
    count++;            // Add request to the counter
    var func = funcArray.pop();
    $.ajax(..., function(data)
    {
        func(data);
        // .......
        count--;        // Substract request to the counter
    });
}

$(function()
{
    call();     // First call to start polling. It will call itself each 100ms
});

$(function()
{
    $("div.server").each(function() {
         funcArray.push(function(data)
         {
            alert(data);
         });
     });
});

必要に応じて微調整する必要がある場合があります。

于 2012-04-23T08:14:51.900 に答える