Обёртка запускает таймер для возвращаемого Promise и очищает его после завершения; timeout ожидания сам по себе не отменяет исходную операцию.
Реализуйте утилиту withTimeout: она принимает асинхронную функцию F и число миллисекунд, возвращает функцию с теми же аргументами и результатом, но отклоняет Promise с ошибкой, если F не завершилась за указанный таймаут.
Обёртка запускает таймер для возвращаемого Promise и очищает его после завершения; timeout ожидания сам по себе не отменяет исходную операцию.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Обёртка запускает таймер для возвращаемого Promise и очищает его после завершения; timeout ожидания сам по себе не отменяет исходную операцию.
Вариант с сохранением this и аргументов:
function withTimeout(fn, ms) {
if (!Number.isFinite(ms) || ms < 0) throw new RangeError('ms');
return function (...args) {
return new Promise((resolve, reject) => {
const timer = setTimeout(() => reject(new Error('time limit exceeded')), ms);
Promise.resolve().then(() => fn.apply(this, args)).then(
value => { clearTimeout(timer); resolve(value); },
error => { clearTimeout(timer); reject(error); }
);
});
};
}
Поздний результат уже не изменит Promise. Для реальной отмены нужен поддержанный F AbortSignal или другой контракт; блокирующий синхронный код таймер не прерывает.