Ответ 1
Моим вариантом использования является то, что у меня есть приложение, в котором люди просматривают некоторые результаты ajax очень быстро, и поэтому, если быстро перейти на страницу, я отменяю ожидающий запрос ajax на пропущенную страницу, это позволяет клиенту быть чистым и эффективным.
Отмена запроса AJAX на стороне клиента осуществляется через XMLHttpRequest.abort()
. Если запрос еще не отправлен при вызове abort()
, запрос не будет выходить. Но если запрос был отправлен, сервер не будет знать, что запрос был прерван. Соединение не будет закрыто, на сервер не будет отправлено сообщение, ничего. Если вы хотите, чтобы сервер знал, что запрос больше не нужен, вам в основном нужно найти способ идентифицировать запросы, чтобы при первоначальном запросе вы получили для него идентификатор. Затем через другой запрос AJAX вы можете сообщить серверу, что предыдущий запрос должен быть отменен. (Если вы ищете вопросы о abort()
как этот и найдите "сервер", вы найдете объяснения, говорящие то же самое.)
Обратите внимание, что uwsgi_ignore_client_abort
- это то, что связано с закрытием соединений на уровне TCP. Это другое дело - отменить запрос AJAX. Как правило, в JavaScript нет действий, которые повлекут за собой закрытие TCP-соединения. Браузер оптимизирует создание и уничтожение соединений в соответствии с его потребностями. Только сейчас я сделал это:
-
Я использовал
lsof
, чтобы проверить, имел ли какой-либо процесс соединение сexample.com
. Их не было. (lsof
- это утилита * nix, которая позволяет отображать открытые файлы. Сетевые подключения - это "файлы" в * nix.) -
Я открыл страницу на example.com в Chrome.
lsof
показывает соединение и процесс, который его открыл. -
Затем я закрыл страницу.
-
Я опросил с помощью
lsof
, чтобы узнать, было ли обнаружено ранее обнаруженное соединение. Он оставался открытым примерно через минуту после того, как я закрыл страницу, хотя не было никакой реальной необходимости поддерживать открытое соединение.
И нет никаких проблем с настройками uswgi, которые заставят его знать о прерываниях, выполняемых с помощью XMLHttpRequest.abort()
Сценарий прецедента, который вы дали, был тем, где пользователи быстро просматривали некоторые результаты. Я вижу две возможности для описания, заданного в вопросе:
-
Пользователь ждет обновления до дальнейшего поискового вызова. Например, Алиса просматривает список имен пользователей, отсортированных по алфавиту для пользователя "Zeno", и каждый раз, когда отображается новая страница, она видит, что имя отсутствует и страницы опущены. В этом случае ничего не нужно прервать, потому что действие пользователя зависит от запроса, который был обработан первым. (Пользователь должен увидеть новую страницу, прежде чем принимать решение.)
-
Пользователь просто пролистывает страницы, не дожидаясь обновления. Алиса снова ищет "Зено", но она считает, что она будет на последней странице, поэтому нажмите, щелкните, щелкните по ней. В этом случае вы можете отменить запросы, сделанные на сервере. Затем нажимается кнопка следующей страницы, увеличивайте количество страниц, которые должны отображаться пользователю, но не отправляйте право на запрос далеко. Вместо этого вы ждете небольшой задержки после того, как пользователь перестанет нажимать кнопку, чтобы отправить запрос с окончательным номером страницы, и поэтому вы делаете один запрос вместо дюжины. Здесь приведен пример debounce, выполненного для поиска DataTables.