Используя jQuery, как я могу отменить / прервать Ajax-запрос , от которого я еще не получил ответ?
javascript
jquery
ajax
lukewm
источник
источник
$.ajaxStop
?ajaxStop
обнаруживает только когда все запросы AJAX завершены, он не останавливает запрос. По моему опыту, вы бы использовать его как это:$(document).ajaxStop(function(){alert("All done")})
. Использование.abort()
- лучший вариант.Ответы:
Большинство методов jQuery Ajax возвращают объект XMLHttpRequest (или эквивалентный), так что вы можете просто использовать
abort()
.Смотрите документацию:
ОБНОВЛЕНИЕ: Начиная с jQuery 1.5 возвращаемый объект является оберткой для собственного объекта XMLHttpRequest, называемого jqXHR. Этот объект, по-видимому, предоставляет все собственные свойства и методы, поэтому приведенный выше пример все еще работает. См . Объект jqXHR (документация по jQuery API).
ОБНОВЛЕНИЕ 2: Начиная с jQuery 3, метод ajax теперь возвращает обещание с дополнительными методами (например, abort), поэтому приведенный выше код все еще работает, хотя возвращаемый объект больше не является
xhr
. Смотрите блог 3.0 здесь .ОБНОВЛЕНИЕ 3 :
xhr.abort()
все еще работает на jQuery 3.x. Не думайте, что обновление 2 является правильным. Больше информации о репозитории jQuery Github .источник
abort
не закрывает установленное соединение с сервером, поэтомуsuccess
все равно будет вызываться. Это очень проблематично для реализаций Comet с длинным опросом..abort()
у меня все еще работает в jQuery 3.2.1. Этот комментарий в связанной проблеме github от члена основной команды jQuery, по-видимому, подразумевает, что этот ответ неверен и.abort()
не был удален.Вы не можете отозвать запрос, но вы можете установить значение тайм-аута, после которого ответ будет игнорироваться. Смотрите эту страницу для JQuery AJAX вариантов. Я считаю, что ваш обратный вызов ошибки будет вызван, если превышен период ожидания. Уже есть время ожидания по умолчанию для каждого запроса AJAX.
Вы также можете использовать прерывание () метод объекта запроса , но, в то время как это приведет к клиенту , чтобы остановить прослушивание события, он
может, вероятно , будет не остановить сервер от обработки.источник
Это асинхронный запрос, то есть после отправки он уже есть.
Если ваш сервер запускает очень дорогую операцию из-за запроса AJAX, лучшее, что вы можете сделать, - это открыть свой сервер для прослушивания запросов отмены и отправить отдельный запрос AJAX, уведомляющий сервер о необходимости прекратить все, что он делает.
В противном случае просто игнорируйте ответ AJAX.
источник
Сохраните вызовы, которые вы делаете, в массиве, а затем вызовите xhr.abort () для каждого.
ОГРОМНАЯ ПРОСМОТР: Вы можете прервать запрос, но это только на стороне клиента. Серверная сторона все еще может обрабатывать запрос. Если вы используете что-то вроде PHP или ASP с данными сеанса, данные сеанса блокируются до завершения Ajax. Итак, чтобы позволить пользователю продолжить просмотр сайта, вы должны вызвать session_write_close (). Это сохранит сеанс и разблокирует его, так что другие страницы, ожидающие продолжения, продолжатся. Без этого несколько страниц могут ожидать снятия блокировки.
источник
Запросы AJAX могут не выполняться в том порядке, в котором они были запущены. Вместо прерывания вы можете игнорировать все ответы AJAX, за исключением самого последнего:
Грубый набросок кода:
Демо на jsFiddle
источник
Нам просто нужно было обойти эту проблему и протестировать три разных подхода.
В нашем случае мы решили использовать подход № 3, поскольку он создает меньшую нагрузку на сервер. Но я не уверен на 100%, если jQuery гарантирует вызов метода .complete (), это может привести к тупиковой ситуации. В наших тестах мы не могли воспроизвести такую ситуацию.
источник
Всегда лучше делать что-то подобное.
Но гораздо лучше, если вы проверите оператор if, чтобы проверить, является ли запрос ajax нулевым или нет.
источник
Просто позвоните xhr. преждевременное прекращение () будь то объект jquery ajax или собственный объект XMLHTTPRequest.
пример:
источник
Я занимался поиском в реальном времени, и мне нужно было отменить ожидающие запросы, которые могли занять больше времени, чем последний / самый последний запрос.
В моем случае я использовал что-то вроде этого:
источник
Как отметили многие в потоке, только потому, что запрос отменен на стороне клиента, сервер все равно обработает запрос. Это создает ненужную нагрузку на сервер, потому что он выполняет работу, которую мы прекратили слушать на внешнем интерфейсе.
Проблема, которую я пытался решить (к которой могут столкнуться и другие), заключается в том, что, когда пользователь вводил информацию в поле ввода, я хотел отменить запрос о типе чувствительности Google Instant.
Чтобы не запускать ненужные запросы и поддерживать работоспособность внешнего интерфейса, я сделал следующее:
По сути, это будет отправлять один запрос каждые 150 мс (переменная, которую вы можете настроить для своих нужд). Если у вас возникли проблемы с пониманием того, что именно здесь происходит, войдите
xhrCount
иxhrQueue
в консоль непосредственно перед , если блок.источник
Просто используйте ajax.abort (), например, вы можете прервать любой ожидающий запрос ajax перед отправкой другого, подобного этому.
источник
Вы можете прервать любой непрерывный вызов ajax с помощью этого
источник
не существует надежного способа сделать это, и я бы даже не попробовал его, как только запрос на ходу; только способ реагировать разумно, чтобы игнорировать реакцию.
в большинстве случаев это может произойти в таких ситуациях, как: пользователь слишком часто нажимает на кнопку, вызывая многократный XHR, здесь у вас есть много опций: либо блокировать кнопку до возвращения XHR, либо даже не запускать новый XHR, пока другой выполняет подсказку пользователь может откинуться назад или отказаться от любого ожидающего ответа XHR, кроме недавнего.
источник
Следующий код показывает как инициирование, так и прерывание Ajax-запроса:
источник
У меня была проблема с опросом, и как только страница была закрыта, опрос продолжался, поэтому в моем случае пользователь пропустил обновление, так как значение mysql устанавливалось в течение следующих 50 секунд после закрытия страницы, даже если я убил запрос ajax, я Обдумав это, использование $ _SESSION для установки переменной не будет обновляться в самом опросе до тех пор, пока он не закончится и не начнется новый, поэтому в моей базе данных было установлено значение 0 = offpage, в то время как я при опросе я запрашиваю эту строку и возвращаю false; когда он равен 0, запрос при опросе, очевидно, даст вам текущие значения ...
Надеюсь это помогло
источник
Если
xhr.abort();
вызывает перезагрузку страницы,Затем вы можете установить
onreadystatechange
перед прерыванием, чтобы предотвратить:источник
Я поделился демонстрацией, которая демонстрирует, как отменить запрос AJAX - если данные не возвращаются с сервера в течение предварительно определенного времени ожидания.
HTML:
JS CODE:
источник
$.ajax
предоставляетtimeout
возможность, так что вам не нужно писать свои собственные. Просто используйте..., data: {...}, timeout: waitTime,...
.