2010-12-03 96 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键。在后端的这种方式,你可以相应地进行处理