在我的网站上,我使用了一个长轮询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');
};
}
答案 0 :(得分:2)
您需要检查XHR readyState 3
(交互式)模式。
longpolltest2.php
应该向您的客户端发送某种"ping data"
(例如,间隔为10秒)。在readyState 4
被触发之前收到的数据称为interactive
,XMLHttpRequest
将触发onreadystatechange
,readyState
设置为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);
}());