【问题标题】:AJAX polling and loopingAJAX 轮询和循环
【发布时间】:2012-04-06 08:43:28
【问题描述】:

我的项目基本上就像一个实时更新的 Reddit 提要。我正在尝试使用 AJAX 定期轮询服务器以一次更新 15 个项目。

我写了一个 for 循环,但它导致浏览器锁定(我猜 XHR 太多了?)。

如何在不锁定浏览器的情况下轮询 Reddit 式提要中的每个项目?最有效的方法是什么?

如果有 100 多个客户端同时使用网络应用,我应该使用长轮询吗?或者我应该选择智能轮询(如果没有数据,则增加请求之间的等待时间)?

谢谢!我还是 AJAX 新手!

for (var i=0; i < id_array_len; i++) {
        // Grab current reply count

        var reply = $("#repl"+item_id).html();
        var url= *php function here*

        var ajaxRequest;

        try{
            // Opera 8.0+, Firefox, Safari
            ajaxRequest = new XMLHttpRequest();
        } catch (e){
            // Internet Explorer Browsers
            try{
                ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try{
                    ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e){
                    // Something went wrong
                    alert("Your browser does not support AJAX!");
                    return false;
                }
            }
        }

        ajaxRequest.onreadystatechange = function(){
            if (ajaxRequest.readystate == 4){
                live_feed_data_tot = ajaxRequest.responseText;

                if (live_feed_data_tot.trim() == "no change" || live_feed_data_tot.trim() == "no meme" || live_feed_data_tot.trim() == "no response"){

                    console.log("(no update)");

                } else {

                    var live_feed_data = live_feed_data_tot.split(',');
                    if (live_feed_data[1] == 'reply') {
                        // Reply count has changed
                        new_reply = live_feed_data[0].trim();

                        // Update actual number
                        $("#repl"+item_id).html(new_reply);

                    }
                }
            }
        }

        ajaxRequest.open('POST', url, true);
        ajaxRequest.send();

【问题讨论】:

  • 向我们展示循环。我已经在没有锁定浏览器的情况下完成了几次不同的操作,所以我希望它在你的代码中。
  • 添加了代码 -- 非常感谢帮助!

标签: javascript ajax polling


【解决方案1】:

使用长(当然适合您的应用程序)超时的长轮询。当然,您的调用需要是异步的。只要没有数据要传递,服务器就会保留答案,直到即将达到超时。一旦客户得到答案,就在您的complete()-Block 中触发下一次长轮询。这样可以最大限度地减少请求数量。

编辑:看到您的代码后,我看到您使用本机 ajax,但使用 jQuery 进行选择。我建议您也将 jQuery 用于您的 ajax 请求 (jQuery .ajax() Doku)。

您的代码应如下所示:

function doAjaxLongpollingCall(){

   $.ajax({
     url: "...",
     timeout: <prettylong>,
     success: function(){
       //process your data
     },
     complete: function(){
       doAjaxLongpollingCall();
     }
   });
}

【讨论】:

  • 感谢您的建议。如果您不介意回答两个问题... 1) 我听说当客户端 > 100+ 时长轮询不是很可扩展。这是真的? 2) 感谢 jQuery 的建议——只是想知道为什么你建议我也将 jQuery 用于我的 AJAX 请求?感谢您的耐心等待!
  • @TheJagganator 我不介意: 1. 是的,长轮询很关键,因为每个客户端都会向服务器发送请求,无论是否有数据要获取。尽管如此,如果您真的需要实时更新,则没有太多选择。您需要正确调整它(例如,相应地设置超时)。顺便提一句。即使是大型门户网站也使用长轮询。 2. Jquery 为您完成所有繁琐的工作(无需浏览器开关,包括回调处理程序等等)。实际上,您可以在需要 20 行本机 JS 的地方编写 3 行 jQuery Ajax 请求。
  • @TheJagganator 如果您有兴趣,可以阅读SPDY。 Firefox11 已经有了,Chrome 当然也有,甚至 Apache-Server 也支持它。不过仍然非常实验性。
  • 您听说长轮询不可扩展的原因是它占用了 apache 线程。这里有一些很好的信息:stackoverflow.com/questions/333664/…
  • 感谢您提供的信息 -- 如果项目仍然涉及 100 多个用户,我是否还应该坚持长轮询?
【解决方案2】:

如果您有很多用户,请切换到socket.io 并省去麻烦。它使用 websockets(使用推送机制)并回退到其他机制,如闪存套接字或长轮询(如果浏览器中不可用)。需要您在 node.js 中创建这部分应用程序。

【讨论】:

  • 由于 IE 不支持 websockets,它几乎可以归结为 ajax longpolls(或者如果安装了 flash)。不过看起来很有趣,也许我会试一试。
  • 这就是为什么它会自动回退而无需与开发人员进行任何交互。确保与 IE6 及更高版本的兼容性。
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2011-04-20
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多