События загрузки в Tom Select формируют основу работы с асинхронными
источниками данных, где список опций не задан статически, а подгружается
по мере ввода пользователя. Модель загрузки построена вокруг функции
load(query, callback), управляемого жизненного цикла
запросов и набора событий, отражающих состояние получения данных,
успешного ответа или ошибки.
Механизм загрузки в Tom Select основан на делегировании запроса
внешнему источнику данных. В отличие от статического режима, где список
options заранее известен, асинхронный режим предполагает
динамическое формирование данных:
Ключевой точкой интеграции выступает функция:
load: function(query, callback) {
fetch(`/api/search?q=${encodeURIComponent(query)}`)
.then(res => res.json())
.then(data => callback(data))
.catch(() => callback());
}
callback является обязательным механизмом завершения
загрузки: его вызов сигнализирует компоненту, что данные получены или
запрос завершился ошибкой.
load)Событие load возникает после успешного получения данных
и их передачи через callback. Оно используется для
постобработки загруженного набора опций.
Сигнатура обработчика:
tomSelect.on('load', function(options, query) {
console.log('Загружено элементов:', options.length);
});
Поведение события:
load();Типичный сценарий использования — аналитика загрузки или дополнительная модификация данных:
tomSelect.on('load', (options, query) => {
options.forEach(opt => {
opt.label = opt.label.toUpperCase();
});
});
Важно учитывать, что изменение данных на этом этапе не всегда влияет на уже отрендеренный список, если рендеринг завершён.
load_error)При сбое сетевого запроса или некорректном ответе API вызывается
событие load_error. Оно является ключевым механизмом
обработки нестабильных источников данных.
tomSelect.on('load_error', function(query, error) {
console.error('Ошибка загрузки:', query, error);
});
Характеристики:
load;callback() без данных в
ошибочном сценарии;Типичные причины:
Пример обработки с повторной попыткой:
tomSelect.on('load_error', (query) => {
setTimeout(() => {
tomSelect.load(query);
}, 1000);
});
Хотя отдельного публичного события loading в
классическом API нет, состояние загрузки отражается через внутренние
классы и поведение компонента. При активном запросе интерфейс переходит
в состояние ожидания.
Основные признаки:
Конфигурационные параметры, влияющие на поведение:
loadThrottle — задержка между запросами;shouldLoad(query) — контроль необходимости
запроса;preload — предварительная загрузка данных.Пример контроля загрузки:
shouldLoad: function(query) {
return query.length > 2;
}
Загрузка данных проходит несколько стадий:
shouldLoad;load(query, callback);load или load_error;Особое значение имеет шаг throttling. Он предотвращает чрезмерное количество запросов при быстром вводе:
loadThrottle: 300
Это значение задаёт минимальный интервал между запросами в миллисекундах.
При асинхронной загрузке часто возникает проблема race condition: пользователь вводит новый запрос до завершения предыдущего. Tom Select решает это через механизм игнорирования устаревших ответов.
Сценарий:
Это предотвращает «перетирание» актуальных данных.
Пример API с поддержкой abort:
let controller;
load: function(query, callback) {
if (controller) controller.abort();
controller = new AbortController();
fetch(`/api?q=${query}`, { signal: controller.signal })
.then(res => res.json())
.then(data => callback(data))
.catch(() => callback());
}
Для повышения производительности Tom Select может использовать
кэширование результатов запросов. Повторные обращения с одинаковым
query могут не вызывать новый HTTP-запрос.
Поведение кэша:
Пример логики кэша:
const cache = {};
load: function(query, callback) {
if (cache[query]) {
callback(cache[query]);
return;
}
fetch(`/api?q=${query}`)
.then(res => res.json())
.then(data => {
cache[query] = data;
callback(data);
});
}
События загрузки часто используются совместно с механикой пагинации. Вместо получения полного списка система возвращает ограниченный набор элементов.
Типичная реализация:
load: function(query, callback) {
fetch(`/api?q=${query}&limit=20`)
.then(res => res.json())
.then(data => callback(data));
}
При необходимости догрузки применяются дополнительные параметры:
offset;page;cursor.События загрузки в этом случае повторяются при каждом новом запросе страницы.
Загрузка данных тесно связана с событием ввода (type).
Каждый ввод может инициировать новый запрос.
Цепочка выглядит так:
type → изменение текста;load;При высокой частоте ввода важны:
loadThrottle;Даже при успешном HTTP-ответе загрузка может считаться ошибочной, если данные не соответствуют ожидаемому формату.
Ожидаемая структура:
[
{ value: '1', text: 'Option 1' },
{ value: '2', text: 'Option 2' }
]
Некорректные случаи:
value;text;В таких ситуациях инициируется load_error, даже если
сеть работает корректно.
Tom Select позволяет повторно инициировать загрузку вручную. Это используется при изменении внешних фильтров или контекста.
tomSelect.clearOptions();
tomSelect.load('new query');
Повторная загрузка вызывает полный цикл событий:
load;load_error;Особый случай — пустой query. Поведение зависит от
конфигурации:
shouldLoad: function(query) {
return query.length === 0 || query.length > 2;
}
При пустом запросе часто используется preload, который
инициирует загрузку сразу при инициализации компонента.
События загрузки влияют на визуальное состояние:
Компонент синхронизирует состояние данных и DOM, минимизируя мерцание и повторный рендер.
Механизм загрузки в Tom Select представляет собой управляемый асинхронный поток, где ключевую роль играют:
load;load;load_error;Эта модель обеспечивает устойчивую работу при частых изменениях ввода, нестабильной сети и больших объёмах данных, сохраняя предсказуемость состояния компонента.