2010-12-03 89 views
0

我有Action,它返回頁面上圖表的數據。它需要chartType參數並返回圖表數據。 Page使用jQuery和$.post函數來調用它。這裏是例子:

var fillChart = function (chartData){ /* fill routine here */}; 

$(function() { 
    $.post(
     '/Charts/ChartsJson', 
     'chartType=Type1', 
     fillChart, 
     'json'); 

    $.post(
     '/Charts/ChartsJson', 
     'chartType=Type2', 
     fillChart, 
     'json'); 

    // other calls here [*] 
}); 

我有一個chartTypes數組,應該被處理。如果我在註釋行之後添加所有呼叫,則它們都將一次發送。沒關係,如果有1到3件物品。但是,如果有更多的項目,那麼它對性能不利。
有什麼方法可以限制同時執行的帖子請求數量嗎?
我知道,我可以使用回調的第一篇文章,這將調用第二,等等......我的問題是:「有沒有其他方式?」

UPD:每個呼叫已經分區。 (並且我的數組中的項目數量並不總是已知的。)此操作每次調用返回大約1000個複雜元素,而不同的chartType說明使用哪個表格(以及提取數據的邏輯)
全部數據的提取可能需要20 ,甚至40秒。所以我想隨時隨地顯示它,因爲它已被處理。

+0

類似的問題:http://stackoverflow.com/questions/4098826/how-can-i-call-ajax-synchronously-without-my-web-page-freezing – 2010-12-03 15:35:55

+0

你說得對。我應該刪除我的問題嗎? – 2010-12-03 15:38:06

回答

4

我已經成功設置了一個特設的「消息隊列」。這些消息可以是json對象,其中的帖子參數作爲數據。您可以讓任意數量的工作人員將對象從隊列中拉出。

例如:

var ajax_message_queue = []; 

ajax_message_queue.push({ 
    "ajaxtype" : "post", 
    "action" : '/Charts/ChartsJson', 
    "data"  : handlers.fillChart, 
    "datatype" : "json" 
}); 

人員很簡單地是一個基於setTimeout函數彈出關閉最早的郵件,並執行它。然後可以阻止工作人員彈出下一條消息,直到完成第一條消息。如果您希望工作人員甚至可以在請求失敗時重做請求。

1

這是由瀏覽器自動完成的 - 網絡瀏覽器在任何時候都不會向任何單個服務器發送超過一定數量的HTTP請求。它們將在完成時自動排隊並執行。

我會建議您重寫您的服務器端代碼,以便一次過提交多個項目,如果您想提高性能。

+0

@The_Smallest我不確定你的意思是「每個帖子請求要求大部分」。我的建議是,您在一個POST請求中發送整個數組的所有數據。 – lonesomeday 2010-12-03 15:29:57

0

您應該一次發送所有數據。重新構建您的輸入數組以擁有chartType鍵。在後端的這種方式,你可以相應地進行處理