Вопрос проверяет понимание работы с промисами, таймерами и обработкой ошибок в асинхронном коде на JavaScript.
Обёртка withTimeout позволяет ограничить время выполнения асинхронной функции. Если функция не завершается за указанное время, она автоматически отклоняется с ошибкой. Это полезно для предотвращения зависаний приложений, например, при запросах к медленным серверам или выполнении длительных вычислений.
Основная идея — использовать Promise.race между промисом, возвращаемым функцией, и промисом, который отклоняется через заданное время. Вот пример реализации:
function withTimeout(fn, timeout) {
return async function(...args) {
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => reject(new Error('Timeout')), timeout);
});
const resultPromise = fn(...args);
return Promise.race([resultPromise, timeoutPromise]);
};
}Предположим, у нас есть асинхронная функция, которая может выполняться долго:
async function fetchData() {
// имитация долгого запроса
await new Promise(resolve => setTimeout(resolve, 5000));
return 'data';
}
const fetchWithTimeout = withTimeout(fetchData, 3000);
try {
const result = await fetchWithTimeout();
console.log(result);
} catch (error) {
console.error(error.message); // 'Timeout'
}AbortController.this — если функция использует this, нужно передавать контекст через .bind или стрелочную функцию.Обёртка withTimeout — простой и эффективный способ добавить таймаут к асинхронным операциям. Она особенно полезна в сценариях, где важна отзывчивость приложения, например, при работе с сетевыми запросами или внешними API.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию