Выбор ответа Senior Состояние и данные обновлено

Гонка ответов при поиске

Вопрос

Поиск отправляет запрос на каждое изменение строки. Иногда на экране результаты для «ко», хотя введено «кот». Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ответ на старый запрос пришёл позже нового и перезаписал результат на экране. Сеть не гарантирует порядок ответов.

Варианты ответа

  1. Ответ на старый запрос пришёл позже нового и перезаписал результат на экранеправильный ответ
  2. React Native кеширует строку ввода и отправляет в запрос её устаревшую копию
  3. Нужно увеличить таймаут запросов, тогда старые ответы успеют прийти вовремя
  4. Сервер всегда отвечает в порядке поступления запросов, значит баг в TextInput

Разбор

Сеть не гарантирует порядок ответов. Если просто вызывать setResults по завершению, выиграет последний пришедший, а не последний отправленный. Решения: AbortController для отмены предыдущего запроса, проверка, что ответ относится к текущему запросу, или TanStack Query с ключом по строке поиска (он покажет данные актуального ключа). Плюс дебаунс, чтобы запросов было меньше. Таймаут и кеш ввода тут не помогут.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.