jQuery队列$ .post请求

时间:2010-12-03 15:20:41

标签: jquery post asynchronous

我有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秒。所以我想在旅途中显示它,因为它已被处理。

3 个答案:

答案 0 :(得分:4)

我在设置临时“消息队列”方面取得了很大成功。消息可以是json对象,其中post的参数作为数据。您可以让任意数量的工作人员将对象从队列中拉出来。

例如:

var ajax_message_queue = [];

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

一个worker只是一个基于setTimeout的函数,弹出最旧的消息并执行它。然后可以阻止工作人员弹出下一条消息,直到第一条消息完成。如果您希望工作人员在失败时可以重做请求。

答案 1 :(得分:1)

这是由浏览器自动完成的 - Web浏览器在任何时候都不会向任何单个服务器发送超过一定数量的HTTP请求。它们将在完成后自动排队并执行。

如果您想提高效果,我建议您重写服务器端代码,以便一次性提交多个项目。

答案 2 :(得分:0)

您应该立即发送所有数据。重新构造输入数组以获得chartType键。那样在后端你可以相应地处理它