Длинный опрос - проблемы с Internet Explorer 8 - PullRequest
6 голосов
/ 07 февраля 2012

Я пытаюсь реализовать длинный опрос с использованием 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 Ответ

9 голосов
/ 07 февраля 2012

Отключите кэширование и посмотрите, решит ли это вашу проблему:

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, но приведенный выше код должен помочь вам начать работу.

...