Прервать ajax-запросы перед отправкой следующего? (JQuery)
-
05-07-2019 - |
Вопрос
У меня есть отчет в нашей внутренней системе, который может возвращать данные от 1 дня до полных лет. Из-за этого отчет может занять 0,5 секунды или более 45 секунд, чтобы сгенерировать все.
Отчет позволяет вам модифицировать кучу фильтров, каждый из которых при модификации запускает ajax-запрос очень просто:
var ax = $.ajax({
type: "GET",
url: "/blah",
data: values,
success: function(data) { .. }
});
Теперь проблема возникает, когда наш замечательный пользователь заявляет "Ой, подождите! Я хочу, чтобы это было с февраля, а не с января! ». Но запрос уже происходит, так как в январе много данных! Итак, пользователь переключает опцию даты на февраль, и я вижу, как консоль Javascript отправляет второй запрос. Теперь у нас два участника, и это гонка!
/ report /? start_date = January (загрузка продолжается ...)
/ report /? start_date = February (Эй, я тоже здесь сейчас!)
Затем обычно меньший загружается раньше, но затем загружается другой, и он перезаписывает тот, который у них уже был .. hmm:)
Я пытался использовать ax.abort ()
, помещенный после объявления переменной ax
, как упоминалось здесь , но, похоже, это не работает.
Так что теперь мне интересно, что мне не хватает? Я просто хочу убить текущий запрос (на стороне клиента, я знаю, что ничего не могу с этим поделать на стороне сервера), как только пользователь изменит некоторые параметры, чтобы у меня не было 2 или более запросов одновременно , Установка async: false
не является опцией, поскольку она просто блокирует пользователя.
Заранее благодарим за помощь.
Решение
Вы можете взглянуть на плагин ajaxmanager .
Другие советы
Я думаю, что попытка прервать предыдущий запрос не является хорошим решением. Возможно, вам следует использовать простой обходной путь - для каждого ajax-запроса увеличить счетчик в javascript и передать его в обратный вызов ajax. Когда происходит обратный вызов, проверьте, совпадает ли счетчик ответа с текущим значением счетчика. Если нет, то проигнорируйте ответ - он был вызван устаревшим событием щелчка.