Проверяет понимание гонок запросов при быстром переключении вкладок и способов их устранения.
Когда пользователь быстро переключается между вкладками, каждая вкладка инициирует API-запрос. Ответы могут приходить в произвольном порядке: запрос, отправленный позже, может завершиться раньше, а более ранний — позже. Если приложение обрабатывает каждый ответ и обновляет состояние, последний пришедший ответ (даже если он устарел) перезапишет актуальные данные. Это классическая гонка запросов (race condition).
Современный способ — отменять предыдущий запрос при переключении вкладки. Используйте AbortController: создайте контроллер для каждого запроса и вызывайте abort() перед новым запросом. Тогда старый запрос будет отменён, и его ответ не попадёт в обработчик.
let controller;
async function fetchData(url) {
if (controller) controller.abort();
controller = new AbortController();
try {
const res = await fetch(url, { signal: controller.signal });
return await res.json();
} catch (e) {
if (e.name === 'AbortError') return;
throw e;
}
}Если отмена невозможна (например, при использовании старых библиотек), можно проверять актуальность ответа. Введите счётчик или уникальный идентификатор запроса. При получении ответа сравнивайте его с текущим идентификатором — если не совпадает, игнорируйте.
let requestId = 0;
async function fetchData(url) {
const currentId = ++requestId;
const data = await fetch(url).then(r => r.json());
if (currentId === requestId) {
// обновляем состояние
}
}Гонки запросов — частая проблема в асинхронных интерфейсах. Используйте AbortController для отмены устаревших запросов или проверку идентификатора, чтобы гарантировать, что в состояние попадают только актуальные данные. Это особенно важно для вкладок, поиска с автодополнением и других сценариев с частыми запросами.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию