Вопрос проверяет понимание того, как асинхронные запросы и обновление состояния взаимодействуют с жизненным циклом React-компонента.
Race condition в React возникает, когда несколько асинхронных запросов выполняются параллельно и обновляют одно и то же состояние. React не знает, какой запрос является “последним” или актуальным. В результате более старый запрос может завершиться позже и перезаписать более свежие данные. Это приводит к отображению устаревшей информации в UI.
Race condition в React — это ситуация, когда порядок завершения асинхронных операций не совпадает с логическим порядком действий пользователя.
Сначала разберём самый частый кейс — запросы, зависящие от props или state.
Компонент рендерится с параметром query = "a"
В useEffect отправляется запрос fetch("a")
Пользователь быстро меняет query на "ab"
React делает новый рендер
useEffect отправляет запрос fetch("ab")
Ответ для "ab" приходит быстро и обновляет state
Ответ для "a" приходит позже и перезаписывает state
useEffect(() => {
fetch(`/api/search?q=${query}`)
.then(res => res.json())
.then(data => {
setResults(data);
});
}, [query]);
Здесь:
Каждый запрос независим
React не контролирует порядок их завершения
Последний завершившийся запрос “побеждает”
React не знает бизнес-логики запроса
Он не понимает, какие данные считаются актуальными
Асинхронность — зона ответственности разработчика
Поиск по мере ввода
Фильтрация списков
Переключение вкладок
Компоненты с быстрыми обновлениями props
Race condition в React возникает из-за конкуренции асинхронных запросов за обновление одного и того же состояния. Без дополнительного контроля React не может гарантировать актуальность данных.