У меня есть запрос AJAX, который будет выполняться каждые 5 секунд. Но проблема в том, что перед запросом AJAX, если предыдущий запрос не выполнен, я должен прервать этот запрос и сделать новый запрос.
Мой код примерно такой, как решить эту проблему?
$(document).ready(
var fn = function(){
$.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
Ответы:
Ajax-метод jquery возвращает объект XMLHttpRequest . Вы можете использовать этот объект для отмены запроса.
XMLHttpRequest имеет метод abort , который отменяет запрос, но если запрос уже был отправлен на сервер, то сервер обработает запрос, даже если мы прервем запрос, но клиент не будет ждать / обрабатывать ответ.
Объект xhr также содержит readyState, который содержит состояние запроса (UNSENT-0, OPENED-1, HEADERS_RECEIVED-2, LOADING-3 и DONE-4). мы можем использовать это, чтобы проверить, был ли выполнен предыдущий запрос.
источник
readystate
выше иreadyState
ниже, символs
заглавной буквы в jQuery 1.5if (xhr) xhr.abort();
будет работать нормально.readystate
в своей документации. Он всегда был написан заглавными буквами,readyState
и jquery (до или после 1.5) правильно соответствовал спецификации w3.Когда вы отправляете запрос на сервер, сначала проверьте, не является ли прогресс первым (или извлекает эти данные). Если он выбирает данные, отмените предыдущий запрос и инициируйте новый.
источник
Я знаю, что это может быть немного поздно, но у меня возникают похожие проблемы, когда вызов метода abort действительно не отменяет запрос. вместо этого браузер все еще ждал ответа, который он никогда не использует. этот код решил эту проблему.
источник
Почему вы должны прервать запрос?
Если каждый запрос занимает более пяти секунд, что произойдет?
Вы не должны прерывать запрос, если параметр, передаваемый вместе с запросом, не изменяется. Например: - запрос на получение данных уведомления. В таких ситуациях хороший подход заключается в том, что новый запрос устанавливается только после завершения предыдущего Ajax-запроса.
источник
Вы можете использовать jquery-validate.js. Ниже приведен фрагмент кода из jquery-validate.js.
Так что вам просто нужно установить режим параметров, чтобы прервать, когда вы делаете ajax-запрос.
Ссылка: https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.js
источник
jQuery: используйте это как отправную точку - как вдохновение. Я решил это так: (это не идеальное решение, оно просто прерывает последнюю инстанцию и использует код WIP)
источник
Создайте функцию для вызова вашего API. В этой функции мы определяем запрос
callApiRequest = $.get(...
- даже если это определение переменной, запрос вызывается немедленно, но теперь у нас есть запрос, определенный как переменная. Перед вызовом запроса мы проверяем, определена ли наша переменная,typeof(callApiRequest) != 'undefined'
а также, ожидает ли она ответаsuggestCategoryRequest.state() == 'pending'
- если оба значения верны, мы.abort()
выполняем запрос, который не позволит выполнить успешный обратный вызов.Ваш сервер / API может не поддерживать прерывание запроса (что, если API уже выполнил некоторый код?), Но обратный вызов javascript не сработает. Это полезно, когда, например, вы предоставляете пользователю предложения ввода, такие как ввод хэштегов.
Вы можете дополнительно расширить эту функцию, добавив определение обратного вызова ошибки - что должно произойти, если запрос был прерван.
Распространенным вариантом использования этого фрагмента будет ввод текста, который инициирует
keypress
событие. Вы можете использовать тайм-аут, чтобы предотвратить отправку (некоторых) запросов, которые вам придется отменить.abort()
.источник
Вы также должны проверить для readyState 0. Потому что когда вы используете xhr.abort (), эта функция устанавливает readyState в 0 в этом объекте, и ваша проверка if всегда будет true - readyState! = 4
источник