Не хотите ждать ответа сервера на запрос AJAX

Я создал длинный опрос с использованием 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

Решение

Вы назначаете 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 обработчик, который, будучи отдельным событием, вероятно, вызывается не в то время.

0

Другие решения

я добавил session_write_close() на стороне сервера, и он работает отлично. Следующий пост помог мне найти решение 🙂

Несколько запросов AJAX задерживают друг друга

0