Я создал длинный опрос с использованием 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;
}
});
}
Вы назначаете 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
обработчик, который, будучи отдельным событием, вероятно, вызывается не в то время.
я добавил session_write_close()
на стороне сервера, и он работает отлично. Следующий пост помог мне найти решение 🙂