Я использую версию обратного вызова опции 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([]);
}
}
}));
},
// ....
Таким образом, всякий раз, когда запускается обратный вызов «источник», он проверяет, существует ли элемент XHR для этого ввода (будет неопределенным в первый раз), и если да, прерывает его (побочный вопрос: как я могу проверить, завершен ли запрос?Нет смысла пытаться прервать запросы, которые уже завершены).
Это важно при предоставлении пользовательского обратного вызова источника для обработки ошибок во время запроса. Вы должны всегда вызывать обратный вызов ответа, даже если вы столкнулись с ошибкой. Это гарантирует, что виджет всегда имеет правильное состояние.
Итак, в нижней части моего кода вы увидите, что я (пытаюсь) проверить, был ли запрос прерван, и если да, я возвращаю пустой список. Но это "прервано!" log никогда не вызывается. Он всегда говорит «успех», даже если он прерывается. Почему это?
Изменить: только что попытался вывести $(this).data('xhr').readyState
. Кажется, никогда не бывает меньше 4
, что говорит мне о том, что source
не вызывается снова, пока последний запрос не вернет ответ. А жаль, потому что мы могли бы прервать запросы раньше и немного ускорить время отклика...