2012-02-06 68 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