Я использую версию обратного вызова опции source
, которая выполняет запрос ajax. Я полагаю, что если пользователь набирает кучу букв в быстрой последовательности до завершения ajax-запроса, мы должны прервать старый и использовать только новый. Я предполагаю, что версия URL для параметра source
сделает это автоматически, но, поскольку я использую пользовательский обратный вызов, мне придется делать это вручную.
Итак, вот что у меня есть:
$('#myselector').autocomplete({
source: function(request, response) {
var data = {};
if($(this).data('xhr')) {
console.log('aborting...');
$(this).data('xhr').abort();
}
// *snip* add some stuff to data
$(this).data('xhr', $.ajax({
url: '/ajax/major_city',
dataType: 'json',
data: data,
success: function(data, textStatus, $xhr) {
response(data);
},
complete: function($xhr, textStatus) {
console.log(textStatus);
if(textStatus === 'abort') {
console.log('aborted!');
response([]);
}
}
}));
},
// ....
Таким образом, всякий раз, когда вызывается обратный вызов «source», он проверяет, существует ли элемент XHR для этого ввода (будет неопределенным в первый раз), и если да, то прерывает его ( side question: how можно проверить, завершен ли запрос? Нет смысла пытаться отменить запросы, которые уже выполнены).
Но В документах написано :
Это важно при предоставлении пользовательского обратного вызова источника для обработки ошибок во время запроса. Вы всегда должны вызывать ответный обратный вызов, даже если вы столкнулись с ошибкой. Это гарантирует, что виджет всегда имеет правильное состояние.
Итак, в нижней части моего кода вы увидите, что я (пытаюсь) проверить, был ли запрос отменен, и если да, я возвращаю пустой список. Но это "прервано!" журнал никогда не кажется, называется. Он всегда говорит «успех», даже когда он прерывается. Почему это?
Редактировать: Только что попытался вывести $(this).data('xhr').readyState
. Кажется, он никогда не бывает меньше 4
, что подсказывает мне, что source
не вызывается снова, пока последний запрос не вернет ответ. Что обидно, потому что мы могли бы прервать запросы раньше времени и немного ускорить время отклика ...