AJAX轮询和循环

时间:2012-03-21 19:09:29

标签: javascript ajax polling

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

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

如何在不锁定浏览器的情况下轮询Reddit-esque Feed上的每个项目?最有效的方法是什么?

如果有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();

2 个答案:

答案 0 :(得分:2)

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

编辑:看到你的代码后,我看到你使用原生的ajax,但使用jQuery进行选择。我建议你也为你的ajax请求使用jQuery(jQuery .ajax() Doku)。

您的代码应如下所示:

function doAjaxLongpollingCall(){

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

答案 1 :(得分:0)

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