2012-02-06 70 views
6

我試圖用Netty和jQuery來實現長輪詢。長輪詢 - Internet Explorer 8的問題

我使用Chrome和Firefox正常工作,但Internet Explorer 8導致我出現問題。

我執行以下代碼,它發送到我的服務器的請求,等待,直到響應從所述服務器接收,然後發送另一個請求。

function longPollRequest() { 
    $.ajax({ 
     url: '/test-path', 
     type: 'GET', 
     success: function(data, textStatus, jqXHR) { 
      longPollRequest(); 
      console.log('Received: ' + data); 
     } 
    }); 
} 

但是,在IE8中,我遇到了無限循環,它凍結了瀏覽器。有趣的部分是我的服務器只接收來自IE的第一個請求。對於發生了什麼,我感到很困惑。如果有人有任何想法,我會非常感謝幫助。

+1

第一行應該是'function longPollRequest(){'來代替。這只是你的文章中的一個錯字嗎? – Jacob 2012-02-07 00:04:49

+3

我敢打賭,IE8緩存您的要求:有你'試過網址: '/測試路徑非緩存=?' +(*的Math.random + 900000 100000)的ToString() – 2012-02-07 00:09:32

+0

@Jocob雅那只是一個錯字。固定。 – 2012-02-07 01:17:07

回答

9

禁用緩存,看看是否能解決您的問題:

function longPollRequest() { 
    $.ajax({ 
     url  : '/test-path', 
     type : 'GET', 
     cache : false, 
     success : function(data, textStatus, jqXHR) { 
      longPollRequest(); 
      console.log('Received: ' + data); 
     } 
    }); 
} 

這將迫使jQuery的一個時間戳附加到每個請求。如果響應被緩存,那麼它會很快返回,這很可能是導致無限循環的原因。

你也可以強制最小延遲AJAX請求之間:

var lastRequestTime = 0; 
function longPollRequest() { 
    $.ajax({ 
     url  : '/test-path', 
     type : 'GET', 
     cache : false, 
     success : function(data, textStatus, jqXHR) { 
      var delay = ((new Date().getTime()) - lastRequestTime); 
      if (delay > 1000) { 
       delay = 0; 
      } else { 
       delay = (1000 - delay); 
      } 
      setTimeout(longPollRequest, delay); 
      console.log('Received: ' + data); 
     } 
    }); 
} 

這將檢查對最後AJAX請求的當前時間。如果超過一秒鐘,那麼只需再次運行該函數,不要延遲,否則請等待,直到請求之間有一秒鐘的時間。可能有更好的方法來定義delay變量,但上面的代碼應該讓你開始。

+3

太棒了,您的解決方案可以正常工作。感謝您指點我正確的方向。我最終爲所有長輪詢響應指定了Cache-Control:no-cache響應頭,並且它也正常工作。 – 2012-02-07 02:26:01