Дополнительно
Прерывание Ajax-запросов с помощью jQuery
Используя jQuery, как я могу отменить/прервать Ajax-запрос, ответ на который я еще не получил?
1769
18
Большинство методов 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.Вы не можете отозвать запрос, но вы можете установить значение тайм-аута, после которого ответ будет проигнорирован. См. эту страницу для опций jquery AJAX. Я полагаю, что ваш обратный вызов ошибки будет вызван, если период таймаута превышен. Уже существует тайм-аут по умолчанию для каждого AJAX-запроса.
Вы также можете использовать метод abort() на объекте запроса, но, хотя это заставит клиента прекратить прослушивание события, это может, вероятно, не остановит сервер от его обработки.
Это асинхронный запрос, то есть, как только он отправлен, он уже там.
В случае, если ваш сервер начинает очень дорогостоящую операцию из-за AJAX запроса, лучшее, что вы можете сделать, это открыть ваш сервер для прослушивания запросов на отмену, и послать отдельный AJAX запрос, уведомляющий сервер прекратить все, что он делает.
В противном случае просто игнорируйте ответ AJAX.
Сохранить звонки в массив, затем вызов XHR.метод abort() на каждом.
Огромный нюанс: вы можете отменить заявку, но это's только на клиентской стороне. На стороне сервера все еще может быть обработка запроса. Если вы используете что-то вроде PHP или ASP с данными сессии, данные сессии блокируется до тех пор, пока Аякс закончил. Так, чтобы позволить пользователю продолжить просмотр веб-сайта, вы должны позвонить session_write_close(). Это экономит время сессии и открывает его, так что другие страницы жду продолжения приступаем. Без этого, несколько страниц можно ждать блокировки, чтобы быть удалены.
AJAX-запросы могут не выполнять в том порядке, в котором они были запущены. Вместо того, чтобы отменить, вы можете выбрать для ignore все AJAX-запросы, кроме самого последнего:
Набросок кода:
[Демо на jsFiddle][1]
Мы просто должны были работать вокруг этой проблемы и испытаны три различных подхода.
в
в
в
В нашем случае мы решили использовать подход #3, Как снизить нагрузку на сервер. Но я не 100% уверен, если jQuery гарантирует зов .выполнить()-метод, это может привести к тупиковой ситуации. В наших тестах мы не смогли воспроизвести такой ситуации.
Это всегда лучшая практика, чтобы сделать что-то подобное.
Но это гораздо лучше, если вы проверите оператор if, чтобы проверить, является ли запрос AJAX имеет значение null или нет.
meouw'ный раствор это правильно, но если вы'повторно заинтересованы в больше контроля, то вы могли бы попробовать Аякс менеджер плагинов для jQuery.
Просто вызов XHR.прервать() будь это'объект с помощью jQuery AJAX или родной XMLHttpRequest объекта.
пример:
Я делал решение прямых поиск и нужно отменять ожидающие запросы, которые, возможно, взяли больше, чем последняя/самая актуальная запросу.
В моем случае я использовал что-то вроде этого:
Как много людей на теме уже отметил, Просто потому, что запрос прерывается на стороне клиента, сервер будет по-прежнему будет обрабатывать запрос. Это создает ненужную нагрузку на сервер, потому что он'делаешь работу, что мы've прекратили прослушивания на переднем конце.
Проблему я пытался решить (что другие могут работать также), что когда пользователь вводит информацию в поле ввода, я хочу, чтобы запрос для Гугла моментальная типа чувствуют.
Чтобы избежать стрельбы ненужных запросов и поддерживать проворностью переднего плана, я сделал следующее:
Это, по сути, отправлять один запрос каждые 150 мс (переменной, которую можно настроить под собственные нужды). Если вы'вновь возникли проблемы с пониманием, что именно здесь происходит, журнал
xhrCount
и `xhrQueue на консоли просто до блока if.Просто использовать AJAX.метод abort() например, вы могли бы отменить все ожидающие запросы AJAX, прежде чем отправить еще один такой
нет надежного способа сделать это, и я бы не даже попробовать его, как только запрос на ходу; только способ разумно реагировать в игнор ответ.
в большинстве случаев, это может произойти в таких ситуациях, как: пользователь нажимает слишком часто на кнопку, вызывая много подряд то XHR, здесь у вас много вариантов, либо заблокировать кнопку до XHR и возвращается, или даже вызвать новое то XHR в то время как другой работает намекая пользователю откинуться назад - или отменить все ожидающие то XHR ответ но в последнее время.
Вы можете прервать любую непрерывную AJAX-вызов с помощью этого
Следующий код показывает инициирования, а также отменить AJAX-запрос:
У меня была проблема голосования и после того, как страница была закрыта, опрос продолжается, так что в моем результате пользователь будет пропустить обновление, как в MySQL значение устанавливается на следующие 50 секунд после закрытия страницы, хотя я убил AJAX-запрос, я понял, что далеко не для всех, с помощью $_SESSION установить ВАР выиграл'т обновления в опросе его собственной, пока его закончился, а новый начался, так что я сделал, было установить значение в моей базе данных как 0 = offpage , в то время как я'м избирательном участке я запрос этой строке и возвращает false; когда он'ы 0 как запрос на избирательных поможет вам текущие значения, очевидно...
Я надеюсь, что это помогло
Я поделился [демо][1], который демонстрирует как отменить AJAX-запрос, если данные не возвращаются от сервера в течение заданного времени ожидания.
HTML-код :
JS КОДА:
Если `то XHR.прервать (); вызывает перезагрузки страницы,
Затем вы можете установить
внутренний
прежде чем прервать, чтобы предотвратить: