2012-04-23 309 views
13

所以我有一系列想要觸發的AJAX事件,但我想限制同時發生的請求數量爲5,並將剩餘的請求數量排隊。因此,例如,我有以下幾點:jQuery限制同時發生的AJAX請求的數量

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

所以有可能是100點的div類server,但我想只運行在任何特定時間5名的請求。一旦請求完成,它應該繼續下一個。

這樣做的最好方法是什麼?

回答

6

這樣做的最好方法是讓瀏覽器處理它。通常,瀏覽器已具有每個主機的連接限制,因此如果連接數太多,它們將自動排隊連接。但是,我會考慮更改API,以便從多個元素中獲取日期,並且還爲多個元素返回數據 - 即減少必需的HTTP請求的總數。

+0

在Chrome中試過,似乎最多一次是4個請求。 – Justin 2012-04-23 08:00:59

+1

同意。聚合數組或對象中的請求參數並傳遞一次,讓服務器處理數組。 – Ross 2012-12-02 13:58:14

4

將所有請求參數推送到一個名爲queueRequest的函數的隊列中,並調用checkQueuecheckQueue將檢查隊列中是否有項目以及活動請求的數量是否小於5.如果滿足這些條件,它會從隊列中彈出一個請求,並將其轉換爲真正的AJAX請求。然後它將done處理程序附加到請求,以減少活動請求計數並調用checkQueue

1

如果仍無法確定瀏覽器的排隊請求的功能,你可以嘗試這樣的事:

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

您可能必須調整它爲您的需求。

+0

不錯,但你應該明確地在通話函數中添加一個「else」後面的if。否則,它會觸發所有的請求,不會做任何等待... – Dunstkreis 2015-12-18 10:19:22