AJAX轮询和循环

AJAX轮询和循环

问题描述:

我的项目基本上就像是实时更新的Reddit源。我试图使用AJAX每隔一段时间轮询服务器以更新15个项目。AJAX轮询和循环

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

如何在不锁定浏览器的情况下轮询Reddit-esque订阅源上的每个项目?什么是最有效的方法来做到这一点?

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

谢谢!我还是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(); 
+0

向我们展示循环。我已经完成了这几个不同的时间没有锁定浏览器,所以我期望它是你的代码中的东西。 – 2012-03-21 19:17:55

+0

添加了代码 - 帮助将非常感谢! – 2012-03-21 19:29:36

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

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

您的代码应该是这个样子:

function doAjaxLongpollingCall(){ 

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

感谢您的建议。两个问题,如果你不介意回答... 1)我听说长时间轮询是不是非常可扩展,当客户> 100+。这是真的? 2)感谢jQuery的建议 - 只是想知道为什么你建议我为我的AJAX请求使用jQuery? 感谢您的耐心等待! – 2012-03-21 19:37:59

+0

@TheJagganator我不介意:1.是的,longpolling非常重要,因为每个客户端都会向服务器发送请求,而不管是否有要获取的数据。尽管如此,如果您确实需要实时更新,那么没有多少选择。您需要调整它的正确性(例如,相应地设置超时)。顺便说一句。即使是巨大的门户使用longpolling。 2. jquery为你做所有肮脏的工作(不需要浏览器开关,包括回调处理程序等等)。实际上,您可以在需要20行本地JS的3行中编写jQuery Ajax请求。 – Christoph 2012-03-21 19:45:25

+0

@TheJagganator如果您有兴趣,您可能需要阅读[SPDY](http://www.chromium.org/spdy)。 Firefox11已经有了它,Chrome当然也有,甚至Apache-Server也支持它。尽管如此,仍然很实验 – Christoph 2012-03-21 19:46:45

如果你正在做大量的用户,切换到socket.io并保存自己的麻烦。它使用websockets(使用推送机制),并且可以回退到其他机制,如flash套接字或长时间轮询(如果浏览器中没有这种机制)。不过需要你在node.js中创建你的应用程序。

+0

因为IE不支持websockets,它几乎归结为ajax longpolls(或者如果安装了flash,也许是flash)。看起来很有趣,也许我会试试看。 – Christoph 2012-03-21 20:48:31

+0

这就是为什么它会自动退回而不会与开发人员进行任何交互。确保与IE6兼容。 – 2012-03-21 21:46:15