> Как реализовать таймаут с abort для запроса в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: циан
Стек: JavaScript
> Пример ответа
Для реализации таймаута с возможностью прерывания (abort) запроса в JavaScript используйте комбинацию AbortController и setTimeout. Это стандартный подход, поддерживаемый в современных браузерах и Node.js (начиная с v15).
Пример с fetch:
JAVASCRIPTfunction fetchWithTimeout(url, timeoutMs = 5000) {const controller = new AbortController();const timeoutId = setTimeout(() => controller.abort(), timeoutMs);return fetch(url, { signal: controller.signal }).then(response => {clearTimeout(timeoutId);if (!response.ok) throw new Error(`HTTP error: ${response.status}`);return response.json();}).catch(error => {clearTimeout(timeoutId);if (error.name === 'AbortError') {throw new Error(`Request timed out after ${timeoutMs}ms`);}throw error;});}// ИспользованиеfetchWithTimeout('https://api.example.com/data', 3000).then(data => console.log(data)).catch(err => console.error(err.message));
Ключевые моменты:
AbortControllerсоздаёт сигнал (signal), который передаётся в опцииfetch.setTimeoutвызываетcontroller.abort()по истечении таймаута, что генерирует исключениеAbortError.- В блоке
catchобязательно очищайте таймер черезclearTimeout, чтобы избежать утечек памяти, если запрос завершился раньше. - Проверяйте
error.name === 'AbortError'для корректной обработки именно таймаута, а не других ошибок сети.
Для XMLHttpRequest (старый стиль):
JAVASCRIPTfunction xhrWithTimeout(url, timeoutMs = 5000) {return new Promise((resolve, reject) => {const xhr = new XMLHttpRequest();xhr.timeout = timeoutMs;xhr.ontimeout = () => reject(new Error('Request timed out'));xhr.onabort = () => reject(new Error('Request aborted'));xhr.onload = () => resolve(xhr.responseText);xhr.onerror = () => reject(new Error('Network error'));xhr.open('GET', url);xhr.send();});}
Этот подход универсален и соответствует современным стандартам веб-разработки.
> Похожие задачи по frontend
В чем разница каррирования и частичного применения в JavaScript
Как реализовать функцию promisify в JavaScript
Можно ли создать функцию для запроса продуктов, которая возвращает промис
Как добавить новый метод в стандартный объект Array через prototype в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью