DOM и React Senior DOM на практике обновлено
Запрос с таймаутом и отменой
Условие
fetchWithTimeout(doFetch, url, ms): вызывает doFetch(url, { signal }) и обрывает запрос через ms миллисекунд, отклоняясь ошибкой с message 'timeout'. Успевший ответ возвращается как есть.
Что проверяют тесты
успевший ответ проходит
медленный обрывается
таймер снимается после успеха
настоящая ошибка не подменяется
Как подойти
Три обязательные детали: signal в запрос, перевод AbortError в понятную ошибку таймаута, clearTimeout в finally. Без последнего контроллер сработает после ответа - в реальном коде это отменяет уже отрисованные данные при переиспользовании. Promise.race с таймером тоже даёт таймаут, но не останавливает сам запрос.
Подсказки: 3
- AbortController.signal передаётся в запрос, abort() его обрывает.
- Отменённый запрос отклоняется ошибкой с name === 'AbortError'.
- После успешного ответа таймер надо снять, иначе он выстрелит впустую.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.