更好的方法来持续运行ajax请求?

时间:2012-07-10 14:07:32

标签: jquery ajax performance timeout

我目前有以下代码,它将运行一堆ajax请求(40-50)然后再次执行它们。 (基本上永远这样做)

代码:

 $(document).ready(function () {
        window.setInterval(function () {
            $('div.env').each(function (index, item) {
                var vm = $(item).text();                    
                var env = "http://localhost:56656/HTML" + vm + ".htm";
                $.ajax(env, {
                    async: false,
                    URL: env,
                    type: "GET",
                    dataType: "html",
                    success: function (data) {
                        //alert("Colouring");
                        var style = $(data).filter('div').attr('style');
                        var styleObj = {};
                        $.each(style.split(';'), function () {
                            var rule = this.split(':');
                            styleObj[$.trim(rule[0])] = $.trim(rule[1]);
                        });

                        $(item).css('background', styleObj.background);

                    },
                    error: function () {

                        $(item).css('background', '#f00');
                    }
                });

            });

        }, 10000);
    });

正如您所看到的,我目前正在使用在IE上运行速度特别慢的Timeout,有时在Chrome上运行缓慢。当我说慢时,我的意思是所有的ajax请求都将完成,然后屏幕将刷新更新。这是IE的情况,偶尔也是Chrome。理想情况下,我希望ajax执行其请求,然后更新然后执行下一个ajax请求。

有没有更好的方法来持续进行AJAX请求?

提前谢谢你, 詹姆斯

4 个答案:

答案 0 :(得分:1)

您可能想要使用Caolan's async library。您的代码可能如下所示(当然包括async.js之后):

$(document).ready(function () {
    function call() {
        var calls = [];
        $('div.env').each(function (index, item) {
            calls.push(function(callback) {
                $.ajax({
                    // DO NOT USE async: false!!!!
                    // some ajax settings
                    complete : function() {
                        callback();
                    }
                });
            });
        });
        async.parallel(calls, function() {
            /* This will fire when every call finishes.
               You may want to add timeout here, or else
               you will end up flooded with requests. */
            call();
        });
    };
});

您应该根据需要进行调整(async也可以处理错误,请阅读文档)。你说你希望他们一个接一个地开火,所以使用async.series而不是async.parallel

BTW这段代码:

$.ajax({
    async: false

PURE EVIL !!! 阻止所有其他脚本甚至整个浏览器!这可能是你“缓慢而眨眼”问题的原因。

答案 1 :(得分:0)

不确定你的情况是否可行,但是像SignalR或Node.Js + Socket.IO这样的websocket / long轮询解决方案通常比连续轮询更好。

答案 2 :(得分:0)

您应该使用setTimeout()代替setInterval()并执行以下操作:

  • 如果请求失败,请执行任何操作:)
  • 如果请求成功,请回复setTimeout()

答案 3 :(得分:0)

我认为这是一个架构问题,而不是其他任何问题。

我建议重建结构以将数组发送到服务器,并将响应发送到一个html页面或json object

原因很明显,无论你做什么,40-50个并发的ajax请求请求最明确地总是很慢,因为即使你的ajax成功处理程序(你绑定的功能)成功)是在10ms内完成的(由于它的复杂性肯定不在IE上),40个请求意味着至少400ms独占时间,导致客户端性能问题。在你的情况下,

async: false

甚至将请求时间添加到该独占时间,因此如果您的请求在10毫秒内完成(极不可能),则使用另外400毫秒的客户端独占时间。

因此,在客户端搜索解决方案并非真正的选择。