长轮询 - Internet Explorer 8的问题

时间:2012-02-06 23:57:33

标签: javascript jquery netty long-polling

我正在尝试使用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的第一个请求。对于发生的事情,我真的很困惑。如果有人有任何想法我会非常感谢你的帮助。

1 个答案:

答案 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变量,但上面的代码可以帮助你开始。