Реализуйте утилиту withTimeout: она принимает асинхронную функцию F и число миллисекунд, возвращает функцию с теми же аргументами и результатом, но отклоняет Promise с ошибкой, если F не завершилась за указанный таймаут.

Обёртка запускает таймер для возвращаемого Promise и очищает его после завершения; timeout ожидания сам по себе не отменяет исходную операцию.

Короткий ответ

Что ответить на собеседовании

Обёртка запускает таймер для возвращаемого 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 или другой контракт; блокирующий синхронный код таймер не прерывает.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее