В КУРСЕ?

Разбираемся в теме

Поиск на JavaScript: как не показать устаревший ответ

Пользователь вводит название товара, затем быстро меняет запрос. Сервер отвечает на второе обращение раньше первого. Если интерфейс без проверки показывает каждый полученный ответ, правильная выдача сменится устаревшей. Такая ошибка возникает даже при исправном сервере. Надёжный поиск требует явных правил: какой запрос сейчас актуален, какое состояние видит человек и кто вправе обновлять страницу.

Опишите состояния до обработчиков

Минимальная модель включает ожидание ввода, загрузку, найденные результаты, отсутствие совпадений и ошибку. Пустая выдача отличается от неудачного обращения к серверу: сообщение ничего не найдено вводит в заблуждение, если сеть недоступна. Для каждого состояния определите видимый текст и доступные действия. Во время загрузки можно сохранить прежние результаты, но нужно обозначить, что они относятся к предыдущему поиску. Альтернативный вариант заключается в их очистке. Важнее выбрать понятное правило, чем незаметно смешать оба поведения. Новое содержимое не должно неожиданно переносить фокус с поля ввода.

Проверьте ответ, прежде чем рисовать список

Успешное завершение fetch ещё не означает успешный ответ сервера. Например, HTTP-ошибка может прийти как обычный объект Response, поэтому проверяют свойство ok или ожидаемый статус. Затем отдельно обрабатывают чтение тела и проверку структуры данных. Предположение, что сервер всегда вернёт массив объектов с нужными полями, делает интерфейс хрупким. Можно получить корректный JSON другой формы. Для вывода пользовательского текста используйте безопасное текстовое представление, а не вставляйте непроверенные строки как HTML. Сообщение человеку должно объяснять следующий шаг, например повторить попытку, без раскрытия технических секретов и внутренних подробностей сервера.

Установите владельца результата

Каждому новому поиску присвойте возрастающий номер. Когда ответ готов, сравните номер завершившегося обращения с номером актуального запроса. Только совпавший запрос получает право менять выдачу. То же правило распространяется на ошибку и индикатор загрузки: старое обращение не должно скрывать индикатор нового. AbortController позволяет отменять предыдущий fetch через связанный сигнал. Это полезно, но отмену стоит сочетать с проверкой актуальности на границе обновления интерфейса. Отмена из-за нового ввода является ожидаемым событием, а не обязательно ошибкой, которую нужно показывать пользователю. Номер запроса делает правило владения явным и помогает проверять другие асинхронные операции.

Испытайте порядок событий

Обычная быстрая сеть плохо выявляет гонки. Нужны сценарии с управляемыми задержками: первый ответ медленный, второй быстрый; ошибка старого запроса приходит после успешного нового; пользователь очищает поле во время загрузки. Очистка тоже меняет актуальность: прежний ответ не должен вернуть исчезнувшую выдачу. Задержка отправки запроса после ввода уменьшает число обращений, но сама по себе не устраняет гонку уже отправленных запросов. Полезно записывать номер запроса и переход состояния в журнал разработки, не сохраняя личные поисковые данные без необходимости. Это позволяет восстановить последовательность событий, а не судить только по последнему изображению экрана.

Попробуйте на практике

Проверьте модель поиска на бумаге, не создавая сервер и не устанавливая библиотеки.

  1. Запишите состояния интерфейса и правило, какой номер запроса считается актуальным.
  2. Составьте последовательность: отправлен запрос 1, отправлен запрос 2, получен ответ 2, получен ответ 1.
  3. Для каждого события укажите, что вправе измениться на экране, включая индикатор загрузки.
  4. Повторите проверку, заменив последний ответ ошибкой, а затем добавив очистку поля перед ответом 2.

Как проверить результат. Ни устаревший результат, ни старая ошибка не заменяют актуальное состояние. После очистки поля запоздавшие ответы не восстанавливают выдачу.

Частые вопросы

Достаточно ли просто задерживать поиск после нажатия клавиш?

Нет. Это сокращает количество запросов, но не задаёт порядок их завершения. Защита актуального состояния всё равно нужна.

Почему проверять нужно и блок завершения загрузки?

Он может выполняться для старого обращения, пока новое ещё работает. Без проверки владельца индикатор исчезнет слишком рано, хотя актуального результата пока нет.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов