首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >持续运行ajax请求的更好方法?

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

Stack Overflow用户
提问于 2012-07-10 22:07:32
回答 4查看 1.5K关注 0票数 3

我现在得到了下面的代码,它将运行一堆ajax请求(40-50),然后再执行一次。(本质上,它们永远都是如此)

代码:

代码语言:javascript
复制
 $(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上运行得特别慢,在chrome上有时也运行得很慢。当我说慢的时候,我的意思是所有的ajax请求都将完成,然后屏幕将用更新刷新。在IE上一直都是这样,偶尔在Chrome上也是如此。理想情况下,我希望ajax做它的请求,更新,然后做下一个ajax请求。

有没有更好的方法来持续处理AJAX请求?

先谢谢你,詹姆斯

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-10 22:20:34

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

代码语言:javascript
复制
$(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

顺便说一句,这段代码:

代码语言:javascript
复制
$.ajax({
    async: false

纯粹的邪恶!会阻止所有其他脚本,甚至整个浏览器!这可能就是你的“慢速眨眼”问题的原因。

票数 2
EN

Stack Overflow用户

发布于 2012-07-10 22:31:41

不确定在您的情况下是否可能,但websocket/长轮询解决方案,如SignalR或Node.Js + Socket.IO,通常比连续轮询工作得更好。

票数 0
EN

Stack Overflow用户

发布于 2012-07-10 22:38:43

您应该使用setTimeout()而不是setInterval(),并执行以下操作:

如果请求失败,请执行任意操作:)

  • 如果请求成功,请使用setTimeout()

调用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11415118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档