长轮询-Internet Explorer 8的问题

Long Polling - Problems with Internet Explorer 8

本文关键字:问题 Explorer -Internet      更新时间:2023-09-26

我正在尝试使用Netty和jQuery实现长轮询。

我在Chrome和Firefox上都能正常工作,但InternetExplorer8给我带来了问题。

我正在执行以下代码,它向我的服务器发送一个请求,等待收到来自服务器的响应,然后发送另一个请求。

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

然而,在IE8中,我遇到了一个无限循环,它冻结了浏览器。有趣的是,我的服务器只收到了来自IE的第一个请求。我真的很困惑到底发生了什么。如果有人有任何想法,我会非常感谢你的帮助。

禁用缓存,看看这是否解决了您的问题:

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

这将强制jQuery为每个请求附加一个时间戳。如果响应被缓存,那么它会很快返回,很有可能这就是导致无限循环的原因。

您还可以强制AJAX请求之间的最小延迟:

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

这将检查当前时间与上次AJAX请求的时间。如果时间超过一秒钟,则立即再次运行该函数,否则请让代码等待一秒钟,直到两次请求之间结束。可能有一种更优雅的方法来定义delay变量,但上面的代码应该让您开始。