Проверьте, активен ли сейчас вызов ajax / http - PullRequest
2 голосов
/ 15 сентября 2010

На моем сайте я использую длинную функцию jjery ajax.Этот ajax-вызов в этой функции имеет тайм-аут в 50 секунд, а затем снова запускается, ожидая изменений на сервере.

Однако иногда длительный опрос http-соединения прекращается.Это происходит, например, когда интернет-соединение не работает, или когда клиентский компьютер включен после сна или спящего режима.Проблема в том, что «полный» обратный вызов еще не происходит, функция $ .ajax () все еще ожидает тайм-аут, а соединение http больше не существует.

Как проверить с помощьюjquery / javascript, если соединение все еще открыто?

Это мой длинный скрипт опроса:

function longPoller() {

    $.ajax({
        type: "GET",
        url: '/longpolltest2.php', 
        dataType: 'json',
        async: true, 
        cache: false,
        timeout:50000, /* Timeout in ms */

        success: function(data){ 

            alert('success');
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){

            alert('error');
        },

        complete: function() { 

            alert('complete');
            longPoller(); // restart long poller request
            }

    });
}

@ jAndy, я обновил скрипт, но я получаю следующую ошибку:

Отказано в http://domain.com разрешении на создание оболочки для объекта класса Безымянный класс

function masterLongPollerDebugger() {

    xhr = $.ajax({
        type: "GET",
        url: '/longpolltest2.php', 
        dataType: 'json',
        async: true, 
        cache: false,
        timeout:50000, 

        success: function(data){ 

            alert('success');
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){

            alert('error');
        },

        complete: function() { 

            alert('complete');
            masterLongPollerDebugger();
            }

    });
}


function ajaxRunning() {

    xhr._onreadystatechange = xhr.onreadystatechange;  // store a reference

    xhr.onreadystatechange = function() 
    {  // overwrite the handler
        xhr._onreadystatechange();   // call the original stored handler
        alert(xhr.readyState);
        if (xhr.readyState === 3) 
            alert('Interactive');
    };
}

Ответы [ 3 ]

2 голосов
/ 15 сентября 2010

Вам необходимо проверить режим XHR readyState 3 (интерактивный).

longpolltest2.php должен отправить клиенту какой-то тип "ping data" (например, с интервалом в 10 секунд).Данные, которые были получены до того, как readyState 4 был запущен, называются interactive, а XMLHttpRequest сгенерирует onreadystatechange с readyState, установленным на 3.

Это имеет некоторые ограничения.IE <8 не поддерживает его, 8 поддерживает его поверх объекта <code>XDomainRequest.Некоторым другим браузерам может потребоваться «прелюдия» данных перед тем, как они запустят readyState 3.

Еще одна вещь, о которой стоит упомянуть: jQuery в настоящее время не поддерживает interactive mode (скорее всего, потому что он далеко от того, чтобы быть перекрестным-браузер совместим).

В любом случае, существует небольшой обходной путь:

var xhr = $.ajax(...);

xhr._onreadystatechange = xhr.onreadystatechange;  // store a reference

xhr.onreadystatechange = function() {  // overwrite the handler
    xhr._onreadystatechange();   // call the original stored handler
    if (xhr.readyState === 3) alert('Interactive');
};
0 голосов
/ 29 апреля 2011

Вы можете попробовать что-то вроде этого:

(function checkAjax() {
    setTimeout(function () {
        if ($.active === 0) {
            alert('Should restart long polling now :-)');
        } else {
            checkAjax();
        }
    }, 500);
}());
0 голосов
/ 15 сентября 2010

попробуйте использовать

$(document).ready(function(){
    SetInterval(function(){ longPoller() }, 50000);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...