我正在尝试使用Netty和jQuery实现长轮询。
我可以正常使用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的第一个请求。对于发生的事情,我真的很困惑。如果有人有任何想法我会非常感谢你的帮助。
答案 0 :(得分: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
变量,但上面的代码可以帮助你开始。