Завершение jQuery.ajax () по событию (я имею в виду прекращение ajax-соединения с сервером) - PullRequest
0 голосов
/ 21 сентября 2011

Этот вопрос должен быть очень знаком тем, кто написал или протестировал автозаполнение интерфейсов с использованием JavaScript, (в реальном времени AJAX).

Я пишу проверку формы в реальном времени.Пользователь печатает свое имя пользователя, и он может видеть "OK" или "Taken" массажи, когда он печатает.

Проблема:

1) Я запускаю $.ajax() на каждом keyup()или change() событие

2) Таким образом, когда пользователь печатает быстро, а соединение медленное, может быть много открытых соединений.Все они, кроме последнего, не актуальны и должны быть прерваны

3) Более того, ping на сервер может варьироваться, например, от 100 мс до 400 мс, поэтому не актуальные ответы приходят последними (!!!)

Это наверняка нужно исправить.

Что мне делать?

Ответы [ 3 ]

1 голос
/ 21 сентября 2011

http://api.jquery.com/jQuery.ajax/#jqXHR

Функция JQuery Ajax возвращает объект jqXHR. Вы можете использовать метод .abort () для завершения предыдущих запросов

0 голосов
/ 21 сентября 2011

Если он соответствует вашим требованиям, возможно, самый простой способ сделать это - использовать стандартный плагин JQuery UI Autocomplete . Это касается сантехники для вас.

Для более сложных требований вы можете свернуть свои собственные. Этот плагин bindWithDelay очень удобен для отсрочки событий нажатия клавиш. Как указывает @Vlad, при запуске запроса Ajax обязательно сохраняйте ссылку на объект jqXHR, чтобы можно было отменить запрос, если сделан второй запрос.

if (jqXHR &&  jqXHR.readyState !== 4) {
  jqXHR.abort();
}

jqXHR = $.ajax({
  ...
});

Обратите внимание, что даже если запрос Ajax будет прерван, сервер продолжит обрабатывать запрос, поэтому вы все равно будете использовать ресурсы сервера. И, конечно же, в обработчике ошибок для вашего Ajax cal обязательно игнорируйте ошибку, вызванную где status === "abort".

0 голосов
/ 21 сентября 2011

Хотя некоторые библиотеки ajax поддерживают прерывание запросов, я постараюсь быть немного более осторожным и упреждающим при заполнении соединения.

Поскольку я не думаю, что вы увидите значительное улучшение производительности от отменызапрос,

скорее всего сервер уже отправляет пакеты, и они будут использовать полосу пропускания в любом случае.

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

например, квота минимум 1 в секунду.

Это также предотвратит двойнойзапуск вы получите от перехвата 2 избыточных событий.

...