> Как реализовать тайм-аут для асинхронного запроса, если ответ приходит дольше одной секунды в JavaScript? (JavaScript)

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

Компании: Яндекс

Стек: JavaScript

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

Для реализации тайм-аута асинхронного запроса в JavaScript можно использовать комбинацию Promise.race() и setTimeout(). Вот пример:

JAVASCRIPT
async function fetchWithTimeout(url, timeout = 1000) {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), timeout);
try {
const response = await fetch(url, { signal: controller.signal });
clearTimeout(timeoutId);
return response;
} catch (error) {
clearTimeout(timeoutId);
if (error.name === 'AbortError') {
throw new Error('Запрос превысил тайм-аут в 1 секунду');
}
throw error;
}
}
// Использование
try {
const data = await fetchWithTimeout('https://api.example.com/data', 1000);
console.log('Ответ получен:', data);
} catch (error) {
console.error('Ошибка:', error.message);
}

Альтернативный вариант с Promise.race() для случаев, когда AbortController недоступен:

JAVASCRIPT
function fetchWithTimeoutRace(url, timeout = 1000) {
return Promise.race([
fetch(url),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Тайм-аут запроса')), timeout)
)
]);
}

Первый вариант предпочтительнее, так как он не только отклоняет промис, но и отменяет сам запрос через AbortController, предотвращая лишнюю нагрузку на сеть. Второй вариант просто игнорирует ответ после тайм-аута, но запрос продолжает выполняться.

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

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