0Pricing
React Academy · Урок

Асинхронные подсказки с debounce

Получайте подсказки из API по мере ввода пользователя, используя debounce для сокращения числа сетевых запросов

«Асинхронные подсказки с debounce» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Замена статического фильтра запросом к API

Вместо фильтрации локального массива вызывайте конечную точку API, которая возвращает подходящие предложения на основе запроса. Вызов API размещается в useEffect, зависящем от значения ввода после дебаунсинга. Это переносит ответственность за фильтрацию на сервер и позволяет использовать нечёткое сопоставление, ранжирование и предложения из гораздо большего набора данных.

Новое состояние загрузки и ошибки

Добавьте в автодополнение две новые переменные состояния: isLoading типа boolean для отображения индикатора загрузки во время выполнения запроса и error типа string или null для вывода сообщения об ошибке, если запрос завершится неудачно. Благодаря этому пользователи получают информацию об асинхронной операции, а не задаются вопросом, почему предложения не появляются.

Эффект запроса

В useEffect для запроса в начале установите setIsLoading(true) и setError(null), затем вызовите fetch(url), разберите JSON, вызовите setSuggestions(data) и наконец установите setIsLoading(false) в блоке finally или после обработки обоих путей — успешного и с ошибкой. Массив зависимостей эффекта должен содержать только debouncedInputValue.

Использование AbortController для отмены запросов

Создайте новый AbortController в начале эффекта и передайте controller.signal параметрам запроса. В функции очистки вызовите controller.abort(). Когда пользователь печатает и значение после дебаунсинга изменяется, предыдущий запрос отменяется до начала нового, поэтому устаревшие результаты не приходят в неправильном порядке.

Обработка ошибок отмены

При отмене запроса он отклоняется с исключением DOM. В блоке обработки ошибок проверьте if (err.name === 'AbortError') return;, чтобы молча игнорировать отменённые запросы. Обрабатывайте только настоящие сетевые ошибки или ошибки API, о которых следует сообщить пользователю.

Управление состоянием isLoading

Устанавливайте isLoading в true перед запросом и в false после его успешного или неуспешного завершения. Используйте блок finally, чтобы гарантировать сброс значения: fetch(url).then(...).catch(...).finally(() => setIsLoading(false)). Без блока finally ошибка запроса оставила бы индикатор загрузки работающим навсегда.

Индикатор загрузки в раскрывающемся списке

Если isLoading имеет значение true и поле ввода содержит текст, показывайте раскрывающийся список с расположенным по центру индикатором загрузки вместо списка предложений. Это сообщает пользователю, что результаты скоро появятся. После завершения загрузки и получения предложений замените индикатор фактическими элементами списка.

Состояние ошибки в раскрывающемся списке

Если error не равен null, показывайте в раскрывающемся списке сообщение об ошибке вместо предложений. Сообщение вроде «Не удалось загрузить предложения. Повторите попытку.» понятнее, чем необработанная строка ошибки. При желании добавьте кнопку повторной попытки, которая вручную запускает запрос заново.

Минимальный порог количества символов

Не выполняйте запросы для пустых строк или слишком коротких запросов, которые дают много нерелевантных результатов. В начале эффекта добавьте проверку: if (debouncedInputValue.length < 2) { setSuggestions([]); return; }. Это уменьшает количество ненужных вызовов API и не позволяет получить слишком длинный список результатов для одного символа.

Кэширование полученных результатов

Храните полученные результаты в Map внутри useRef: const cache = useRef(new Map()). Перед выполнением запроса проверьте if (cache.current.has(query)) { setSuggestions(cache.current.get(query)); return; }. После успешного запроса сохраните результат. Это устраняет повторные сетевые запросы для запросов, которые пользователь уже вводил.

Рекомендуемая задержка дебаунсинга

Для автодополнения оптимальна задержка дебаунсинга 200–300 мс. Меньшая задержка, менее 200 мс, запускает слишком много запросов у пользователей, быстро печатающих текст. Большая задержка, более 400 мс, делает предложения медленными и неотзывчивыми. Значение 250 мс часто используется по умолчанию в промышленных реализациях автодополнения.

AbortController в автодополнении

Почему AbortController важен в автодополнении с дебаунсингом, которое получает данные из API?

Повторение урока: асинхронные предложения с дебаунсингом

Замените статическую фильтрацию запросом к API внутри useEffect, зависящего от значения после дебаунсинга. Используйте AbortController, чтобы отменять устаревшие запросы. Добавьте состояния isLoading и error для обратной связи с пользователем. Установите минимальный порог количества символов, чтобы избежать чрезмерного числа вызовов. Кэшируйте результаты в ссылке, чтобы пропускать повторные сетевые запросы.

Часто задаваемые вопросы

Урок «Асинхронные подсказки с debounce» бесплатный?

Да — полный текст урока «Асинхронные подсказки с debounce» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Асинхронные подсказки с debounce»?

Получайте подсказки из API по мере ввода пользователя, используя debounce для сокращения числа сетевых запросов Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Асинхронные подсказки с debounce»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Управляемый ввод со списком подсказок
  2. Навигация с клавиатуры в списках подсказок
  3. Асинхронные подсказки с debounce
  4. Доступность виджетов автодополнения
← Назад к React Academy