检查ajax call / http连接是否是当前活动的

时间:2010-09-15 09:06:20

标签: jquery ajax

在我的网站上,我使用了一个长轮询jquery 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拒绝为UnnamedClass类的对象创建包装器的权限

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 个答案:

答案 0 :(得分:2)

您需要检查XHR readyState 3(交互式)模式。

longpolltest2.php应该向您的客户端发送某种"ping data"(例如,间隔为10秒)。在readyState 4被触发之前收到的数据称为interactiveXMLHttpRequest将触发onreadystatechangereadyState设置为3

这有一些限制。 IE< 8不支持它,8支持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');
};

答案 1 :(得分:0)

尝试使用

$(document).ready(function(){
    SetInterval(function(){ longPoller() }, 50000);
});

答案 2 :(得分:0)

您可以尝试这样的事情:

(function checkAjax() {
    setTimeout(function () {
        if ($.active === 0) {
            alert('Should restart long polling now :-)');
        } else {
            checkAjax();
        }
    }, 500);
}());