2012-02-21 30 views
0

更新:似乎我一直在浪費我的時間在一定程度上根據http://www.browserscope.org/?category=network&v=top-d大多數現代瀏覽器已經限制連接到單個主機的數量。 6是適合我的目的的普通連接數。但我想這仍然是一個有趣的問題。JQuery/PHP - 分批分解一堆Ajax請求?

我工作任務拼圖的最後一部分是將可能超過250個ajax請求的列表分成批次。

如下面的PHP代碼

<? 
// print("alert(\" booya \");"); 
    $hitlist = array(); 
    $hitlist = urlBuilder($markets,$template); 
    foreach ($hitlist as $mktlist) { 
     foreach ($mktlist as $id => $hit) { 
      $cc = substr($id,0,2); 
      $lc = substr($id,-4); 
      echo ("$(\"#" . $cc . $lc . "\").load(\"psurl.php?server=" . $server . "&url=" . $hit . "&port=" . $port . "\");\n"); 
     } 
    } 
?> 

這產生jquery的.load的這些現在都在執行點擊了一長串的結果。

例如

$("#sesv-1").load("psurl.php?server=101.abc.com&url=/se/sv&port=80"); 
$("#sesv-2").load("psurl.php?server=101.abc.com&url=/se/sv/catalog/&port=80"); 
$("#sesv-3").load("psurl.php?server=101.abc.com&url=/se/sv/catalog/products/12345678&port=80"); 
$("#atde-1").load("psurl.php?server=101.abc.com&url=/at/de&port=80"); 
$("#atde-2").load("psurl.php?server=101.abc.com&url=/at/de/catalog/&port=80"); 
$("#atde-3").load("psurl.php?server=101.abc.com&url=/at/de/catalog/products/12345678&port=80"); 
$("#benl-1").load("psurl.php?server=101.abc.com&url=/be/nl&port=80"); 
$("#benl-2").load("psurl.php?server=101.abc.com&url=/be/nl/catalog/&port=80"); 
$("#benl-3").load("psurl.php?server=101.abc.com&url=/be/nl/catalog/products/12345678&port=80"); 
$("#befr-1").load("psurl.php?server=101.abc.com&url=/be/fr&port=80"); 
$("#befr-2").load("psurl.php?server=101.abc.com&url=/be/fr/catalog/&port=80"); 
$("#befr-3").load("psurl.php?server=101.abc.com&url=/be/fr/catalog/products/12345678&port=80"); 

取決於具體情況,它可以像250個請求或者可能只有30-40個。該應用程序的全部目的是預熱新重新啓動的應用程序...所以250新的jvm =死亡請求!

所以理想情況下,我想打破它們。一次最多5-6次請求可能是市場最好的意思。

關於如何完成這一任何想法?標準jQuery中可能嗎?試圖使依賴性儘可能有限,所以最好不使用插件!

+0

如果你的意思是等待X個請求完成,找出你希望X是什麼,並使用'count'變量在'setTimeout'中運行它們以限制運行的查詢數量。 – 2012-02-21 14:03:22

+0

嗯 - 是的,我猜想甚至比設置x = 5總是有5個跑步更好。即當一個請求完成時,計數減少到4,所以它開始一個新的請求。而不是等待x = 0,然後再開始5個。 – Seer 2012-02-21 14:12:10

+0

如果它適合你,那麼是的,解決方案將確保5總是運行,而不是一次5。 – 2012-02-21 14:15:15

回答

1

您可以使用jQuery的.queue

// Define a queue for execution 
var 
$elem = $("#sesv-1"), 
enqueue = function(a){ $elem.queue("status", a) }; 

// Queue your requests 
enqueue(function(a){ 
    $aElem.load("url", a); 
}); 

enqueue(function(a){ 
    $otherElem.load("url", a); 
}); 

// Execute the queue 
$elem.dequeue("status"); 

您可以根據需要創建儘可能多的隊列(最有可能是每個市場),然後排隊請求。

+0

只讀了幾分鐘,我可能會錯過一些東西,但隊列的大小是固定的嗎?即'1'換句話說,它變成了同步的,這就是我重寫這個東西的原因,所以它可能是異步的......當然,更快地做250個請求......你可能會說增加25000% )但是對於這種情況來說太多了。我們會對同時5次命中500%的性能提升而非老舊的cgi同步腳本感到滿意! – Seer 2012-02-21 14:48:00

+0

@Seer,正如我所說的你可以創建多個隊列並全部執行它們。假設其中5個。 – Alexander 2012-02-21 15:10:03