我使用jQuery / PHP创建了一个长轮询。它工作得很好。问题是当用户单击其他链接或刷新当前页面时,它将挂起当前页面,直到它从服务器的最后一个AJAX请求得到响应。
我在服务器端设置了大约30秒来选择最新数据,意味着如果有人发送了获取最新数据的请求,他就不能转到另一个页面或刷新当前页面,直到它返回响应。最糟糕的情况是,如果服务器没有找到最新数据,它将在30秒后发送响应。
我使用以下代码中止请求。
window.onbeforeunload = function(event) {
xhr.abort();
}
我在执行xhr.abort()
之前和之后检查了控制台,它显示readyState=1
然后readyState=0
。这是否意味着xhr.abort()
成功执行了?但是为什么页面仍然挂在当前页面上,直到它返回响应。
请帮我解决我的问题。当用户点击其他链接或刷新页面或在页面上执行其他操作时,我不想等到服务器响应。
这是我的jQuery代码
function setNoti(ntotal)
{
var t;
xhr = $.ajax({
type: "POST", url: myURL, data: "", dataType: "JSON", cache: false, async: true,
success: function(data) {
// do my work here
clearInterval(t);
t = setTimeout(function() {
setNoti(20);
}, 1000);
return false;
},
error: function()
{
clearInterval(t);
t = setTimeout(function() {
setNoti(0);
}, 40000);
return false;
}
});
}
答案 0 :(得分:0)
您正在分配一个xhr
,然后可以用来在后续调用该函数时中止该请求。
function setNoti(ntotal)
{
if (xhr) {
xhr.abort();
}
var t;
xhr = $.ajax({
type: "POST", url: myURL, data: "", dataType: "JSON", cache: false, async: true,
success: function(data) {
// do my work here
clearInterval(t);
t = setTimeout(function() {
setNoti(20);
}, 1000);
return false;
},
error: function()
{
clearInterval(t);
t = setTimeout(function() {
setNoti(0);
}, 40000);
return false;
}
});
}
不需要window.onbeforeunload
处理程序,这可能是在错误的时间调用的单独事件。
答案 1 :(得分:0)
我在服务器端添加了session_write_close()
,它运行正常。以下帖子帮助我找到解决方案:)