所以我有一系列想要觸發的AJAX事件,但我想限制同時發生的請求數量爲5,並將剩餘的請求數量排隊。因此,例如,我有以下幾點:jQuery限制同時發生的AJAX請求的數量
$("div.server").each(function() {
$.ajax(....);
});
所以有可能是100點的div類server
,但我想只運行在任何特定時間5名的請求。一旦請求完成,它應該繼續下一個。
這樣做的最好方法是什麼?
所以我有一系列想要觸發的AJAX事件,但我想限制同時發生的請求數量爲5,並將剩餘的請求數量排隊。因此,例如,我有以下幾點:jQuery限制同時發生的AJAX請求的數量
$("div.server").each(function() {
$.ajax(....);
});
所以有可能是100點的div類server
,但我想只運行在任何特定時間5名的請求。一旦請求完成,它應該繼續下一個。
這樣做的最好方法是什麼?
這樣做的最好方法是讓瀏覽器處理它。通常,瀏覽器已具有每個主機的連接限制,因此如果連接數太多,它們將自動排隊連接。但是,我會考慮更改API,以便從多個元素中獲取日期,並且還爲多個元素返回數據 - 即減少必需的HTTP請求的總數。
將所有請求參數推送到一個名爲queueRequest
的函數的隊列中,並調用checkQueue
。 checkQueue
將檢查隊列中是否有項目以及活動請求的數量是否小於5.如果滿足這些條件,它會從隊列中彈出一個請求,並將其轉換爲真正的AJAX請求。然後它將done
處理程序附加到請求,以減少活動請求計數並調用checkQueue
。
如果仍無法確定瀏覽器的排隊請求的功能,你可以嘗試這樣的事:
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);
});
});
});
您可能必須調整它爲您的需求。
不錯,但你應該明確地在通話函數中添加一個「else」後面的if。否則,它會觸發所有的請求,不會做任何等待... – Dunstkreis 2015-12-18 10:19:22
在Chrome中試過,似乎最多一次是4個請求。 – Justin 2012-04-23 08:00:59
同意。聚合數組或對象中的請求參數並傳遞一次,讓服務器處理數組。 – Ross 2012-12-02 13:58:14