2015-09-08 2 views
1

Я использую Spring MVC, и я создал контроллеры, и я обращаюсь к ним с помощью запроса JQuery Ajax, но иногда бывает возможно, что процесс занимает много времени , поэтому я хочу дать пользователю возможность остановить запрос для этого, я использую функцию прерывания JQuery, и он успешно завершает запрос Ajax, но не останавливает процесс, запущенный на контроллере. Есть ли другой способ сделать это?Остановить запрос Ajax, а также процесс, запущенный на контроллере весной

+0

Я не думаю, что это можно сделать, если вы не проводите непрерывный опрос текущего статуса или что-то с сервера –

ответ

0

Объявляем переменную для хранения запрос на АЯКС

var req = $.ajax({ 
    type: 'GET', 
    url: '<*url*>', 
    ...... 
}); 

Мы можем использовать мой запрос .abort()

req.abort(); 

Проверка для справки jQuery ajax

+1

еще раз проверьте его вопрос. Он в состоянии это сделать. О чем беспокоит OP, является код контроллера, который уже запущен сейчас. –

+0

Я уже использовал его, пожалуйста, внимательно прочитайте мой вопрос. Спасибо. –

+0

Спасибо за это. Ну, остановка ответа не невозможна, но будет неопрятный код. Тем не менее, если это требование, вы можете сделать это другим способом. Вы всегда можете держать сеанс проверки во время выполнения кода вашего контроллера.Событие на стороне клиента (например, нажатие кнопки) всегда может запускать еще один ajax, чтобы отключить эту переменную сеанса по требованию. – Subhasis

1

Если запрос уже отправлен на сервер то сервер будет обрабатывать запрос, даже если мы отменим запрос, но клиент не будет ждать/обрабатывать ответ ,

Возможно, вам придется написать какую-то пользовательскую логику, где инициировать поток в контроллере для каждого такого вызова ajax и отслеживать их идентификатор потока. Затем при запросе на прерывание вернитесь в контроллер и убейте этот поток.

Просто базовая идея, я не реализовал ее сам, поэтому не уверен в проблемах с кодом/логикой, с которыми вы можете столкнуться.

+0

Да, я тоже подумал об этом, но потом мне нужно использовать многопоточность, а также получить все потоки, но это будет сложная задача. это решение, но я буду использовать его в качестве последнего решения. Я ищу еще одно простое и выполнимое решение, но спасибо за ваши усилия. –

+1

просто для того, чтобы улучшить lil бит в моем ответе - каждый HTTP-запрос представляет собой отдельный поток сам по себе. Поэтому, возможно, вам не нужно писать собственный код для многопоточности. но продолжайте регистрировать эти потоки запросов в некоторой статической коллекции. и убить и отменить регистрацию при прерванном вызове. –

+0

ОК, я попробую это. –

0

Ваш предел jQuery() остановит клиента для прослушивания ответа, но все же сервер будет обрабатывать.

я могу думать о чем-то: (я надеюсь, что этот процесс достаточно долго для вас, чтобы остановить, кстати)

  • Непрерывный опросом с помощью нити. Имейте флаг состояния, который читает на высокой частоте, так что, когда вы делаете прерывание, вы обновляете статус запроса для остановки. Если включен непрерывный опрос, вы можете проверить, что статус теперь отменяется, а поток остановлен или что-то в этом роде.
0

Если вы не используете какую-либо пользовательскую логику, невозможно остановить непрерывный процесс на уровне контроллера. Поскольку процесс контроллера и пользовательский интерфейс - это два разных уровня, единственное соединение между ними - это запрос на соединение с запросом на соединение.

abort на стороне javascript может вызвать большой риск для вашего приложения, бэкэнд завершит процесс, но ui не будет знать об этом. Вы можете управлять временем ответа на стороне контроллера и возвращать ошибку и прерывать процесс контроллера своей собственной логикой. например, если у вас есть какой-то цикл на контроллере, поставьте timecheck или у вас есть другое соединение сокета, например db, настройте свое соединение на основе параметра тайм-аута.

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

Смежные вопросы