2012-03-21 123 views
2

我的項目基本上就像是實時更新的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

回答

2

長時間使用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

0

如果你正在做大量的用戶,切換到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