Подтвердить что ты не робот

Как отменить запрос ajax, который был запущен (на стороне сервера)

Мне было интересно, есть ли простой способ отменить запрос AJAX?

Помимо простого вызова "abort" в XMLHTTPRequest на стороне клиента, есть ли способ легко остановить процесс сервера? Сервер использует Apache.

Спасибо

4b9b3361

Ответ 1

Нет. Там определенно нет простого способа.

Я могу думать о некоторых сложных способах, но они были бы ненадежными.

Вероятнее всего, вам удастся разработать процесс для изменения изменений из запрошенного вами запроса (я предполагаю, что причина, по которой вы хотели бы остановить его.)

Ответ 2

Инициировать другой запрос Ajax. Я нашел этот поток, пытаясь выяснить, как предотвратить прерывание предыдущего запроса при вызове другого.

Ответ 3

нет хороших способов остановить сам запрос по сети (как многие говорили), но относительно легко остановить последствия запроса. то есть.

на стороне сервера: вы могли бы exit (или любой другой термин, который вам потребуется убить script), постоянно проверяя глобальные переменные (действующие в виде флагов), такие как файлы cookie или сеансы (опять же, если они будут меняться во время выполнения script). кроме того, вы могли бы хранить файлы или записи базы данных в виде флагов (которые вы можете опросить для существования).

на стороне клиента: вы можете вызвать abort (который не работает во всех браузерах, как говорят другие), или вы можете сохранить глобальный семафор/флаг в верхней части вашего обратного вызова (который проверяет глобальное значение, чтобы увидеть, должно ли оно выполняться или нет). Пример:

 window.ajaxIsStillGood = true;

 xhr.onreadystatechange = function( )
 {
     if( 4 === xhr.readyState && 200 === xhr.status )
     {
         if( true === window.ajaxIsStillGood ){ /* still good */ }
     }
 }

 /* bad stuff happens */

 window.ajaxIsStillGood = false; // now the code won't execute

Ответ 4

Самый простой способ - просто отправить заголовок HTTP-ответа 503 (или аналогичный) и отменить приложение на стороне сервера (или просто прервать приложение). Предполагая, что данные не были отправлены и/или вы не отметили клиентскую сторону заголовка ответа HTTP, вы можете просто рассматривать его как неудавшийся запрос.

Ответ 5

Короткий ответ - "нет". Если вы не говорите о очень продолжительном фоновом процессе на стороне сервера, в этом случае у вас может быть второй запрос Ajax, инициирующий остановку на нем. Но если вы говорите о регулярном запросе на сервер Apache/PHP, то нет... определения того, какой поток Apache, на который был запущен ваш запрос, будет проблемой.

Было бы намного проще проверить ваш запрос Ajax каким-то образом до начала процесса; убедитесь, что вы хотите работать. У вас также может быть процесс подтверждения Javascript, если вам нужно, чтобы пользователь знал, что то, что они делают, не может быть прервано.

Как сказал Стивен, процесс разворота звучит так, как будто он может быть в ваших интересах.

Ответ 6

Для PHP я нашел способ остановить или прервать с помощью session_write_close();. Просто поставьте это после session_start() на script. Если вы используете framwework или OOP, сохраните его как первую строку вашего метода. Это происходит потому, что данные сеанса заблокированы до завершения ajax.

Протестировано и увидела, что другая страница теперь загружается после xhr.abort()

Рекомендации, найденные здесь Отменить запросы Ajax с использованием jQuery

Ответ 7

Как насчет отправки другого запроса Ajax, который изменит конкретный $_SESSION var, который отслеживается этим длительным процессом?