Я прочитал много похожих вопросов об отмене запроса POST с помощью jQuery, но ни один из них не кажется мне близким.
У меня есть ваша повседневная форма, в которой есть PHP-страница как действие:
<form action="results.php">
<input name="my-input" type="text">
<input type="submit" value="submit">
</form>
Обработка results.php
на стороне сервера, основанная на информации о сообщении, приведенной в форме, занимает много времени (30 секунд или даже больше, и мы ожидаем увеличения, потому что наше поисковое пространство также увеличится в ближайшие недели). Мы обращаемся к серверу Basex (версия 7.9, не обновляемая), которая содержит все данные. Созданный пользователем код XPath представляется в форме, и URL-адрес действия отправляет код XPath на сервер Basex, который возвращает результаты. С точки зрения удобства использования я уже показываю экран загрузки, поэтому пользователи, по крайней мере, знают, что результаты генерируются:
$("form").submit(function() {
$("#overlay").show();
});
<div id="overlay"><p>Results are being generated</p></div>
Однако я также хотел бы дать пользователям возможность нажать кнопку, чтобы отменить запрос и отменить запрос, когда пользователь закрывает страницу. Обратите внимание, что в первом случае (при нажатии кнопки) это также означает, что пользователь должен оставаться на одной странице, редактировать свои данные и сразу же повторно отправлять запрос. Крайне важно, чтобы при отмене запроса они также могли сразу же отправить его повторно: сервер должен действительно прервать и не завершить запрос перед тем, как обработать новый запрос.
Я понял что-то вроде этого:
$("form").submit(function() {
$("#overlay").show();
});
$("#overlay button").click(abortRequest);
$(window).unload(abortRequest);
function abortRequest() {
// abort correct request
}
<div id="overlay">
<p>Results are being generated</p>
<button>Cancel</button>
</div>
Но, как вы можете видеть, я не совсем уверен, как заполнить abortRequest
, чтобы убедиться, что запрос на отправку отменен и завершен, чтобы можно было отправить новый запрос. Пожалуйста, заполните пробелы! Или мне нужно .preventDefault()
передать форму и вместо этого выполнить вызов ajax() из jQuery?
Как я уже сказал, я также хочу остановить процесс на стороне сервера, и из того, что я прочитал, мне нужно exit()
для этого. Но как я могу exit
еще одна функция PHP? Например, скажем, что в results.php
у меня есть обработка script, и мне нужно выйти из этого script, я бы сделал что-то вроде этого?
<?php
if (isset($_POST['my-input'])) {
$input = $_POST['my-input'];
function processData() {
// A lot of processing
}
processData()
}
if (isset($_POST['terminate'])) {
function terminateProcess() {
// exit processData()
}
}
а затем выполнить новый запрос ajax, когда мне нужно завершить процесс?
$("#overlay button").click(abortRequest);
$(window).unload(abortRequest);
function abortRequest() {
$.ajax({
url: 'results.php',
data: {terminate: true},
type: 'post',
success: function() {alert("terminated");});
});
}
Я сделал еще несколько исследований, и я нашел этот ответ. Он упоминает connection_aborted(), а также session_write_close(), и я не совсем уверен, что полезно для меня. Я использую переменные SESSION, но мне не нужно записывать значения, когда процесс отменяется (хотя я бы хотел, чтобы переменные SESSION активны).
Будет ли это так? И если да, то как сделать одну функцию PHP завершающей другую?
Я также читал в Websockets, и кажется, что это может сработать, но мне не нравится проблема настройки сервера Websocket, так как это потребует от меня контакта с нашим ИТ-парнем, который требует обширного тестирования новых пакетов. Я бы предпочел сохранить его в PHP и JS, без сторонних библиотек, кроме jQuery.
Учитывая большинство комментариев и ответов, я считаю, что то, чего я хочу, невозможно, мне также интересно услышать альтернативы. Первое, что приходит на ум, - это вызывные вызовы Ajax (похожие на многие веб-страницы, которые служат для поиска результатов, изображений, "что-вы" в бесконечном прокрутке). Пользователь получает страницу с первыми результатами X (например, 20), а при нажатии кнопки "показать следующие 20 результатов", которые показаны, добавляются. Этот процесс может продолжаться до тех пор, пока не будут показаны все результаты. Поскольку пользователям полезно получить все результаты, я также предоставил опцию "загрузить все результаты". Это также займет очень много времени, но по крайней мере пользователи должны иметь возможность пройти первые результаты на самой странице. (Таким образом, кнопка загрузки не должна нарушать загруженные пользователем загрузки Ajax.) Это просто идея, но я надеюсь, что это даст некоторым из вас вдохновение.