Как отменить запущенный ajax-запрос (на стороне сервера) - PullRequest
13 голосов
/ 29 апреля 2009

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

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

Спасибо

Ответы [ 7 ]

7 голосов
/ 29 апреля 2009

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

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

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

4 голосов
/ 11 января 2010

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

1 голос
/ 28 января 2010

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

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

на стороне клиента: вы можете вызвать 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
0 голосов
/ 07 декабря 2017

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

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

Решения найдены здесь Прервать Ajax-запросы, используя jQuery

0 голосов
/ 29 сентября 2016

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

0 голосов
/ 29 апреля 2009

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

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

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

0 голосов
/ 29 апреля 2009

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

...