DOM и React Senior DOM на практике обновлено

Запрос с таймаутом и отменой

Условие

fetchWithTimeout(doFetch, url, ms): вызывает doFetch(url, { signal }) и обрывает запрос через ms миллисекунд, отклоняясь ошибкой с message 'timeout'. Успевший ответ возвращается как есть.

Что проверяют тесты

  • успевший ответ проходит

  • медленный обрывается

  • таймер снимается после успеха

  • настоящая ошибка не подменяется

Как подойти

Три обязательные детали: signal в запрос, перевод AbortError в понятную ошибку таймаута, clearTimeout в finally. Без последнего контроллер сработает после ответа - в реальном коде это отменяет уже отрисованные данные при переиспользовании. Promise.race с таймером тоже даёт таймаут, но не останавливает сам запрос.

Подсказки: 3
  1. AbortController.signal передаётся в запрос, abort() его обрывает.
  2. Отменённый запрос отклоняется ошибкой с name === 'AbortError'.
  3. После успешного ответа таймер надо снять, иначе он выстрелит впустую.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.