> Как реализовать таймаут с abort для запроса в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: циан

Стек: JavaScript

> Пример ответа

Для реализации таймаута с возможностью прерывания (abort) запроса в JavaScript используйте комбинацию AbortController и setTimeout. Это стандартный подход, поддерживаемый в современных браузерах и Node.js (начиная с v15).

Пример с fetch:

JAVASCRIPT
function 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 (старый стиль):

JAVASCRIPT
function 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();
});
}

Этот подход универсален и соответствует современным стандартам веб-разработки.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью