Если таймаут не очищать после успешного выполнения функции, что произойдёт? Как это исправить и какой метод промиса подойдёт для очистки таймаута в любом случае (и при успехе, и при ошибке)?

Функция withTimeout должна принимать функцию, которая возвращает промис, и время в миллисекундах.

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

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

Функция withTimeout должна принимать функцию, которая возвращает промис, и время в миллисекундах. Она возвращает новую функцию, которая при вызове запускает исходную функцию и одновременно таймер. Если исходная функция не успевает завершиться за заданное время, промис отклоняется с ошибкой таймаута.

Подробный разбор

Ответ с пояснениями

Функция withTimeout должна принимать функцию, которая возвращает промис, и время в миллисекундах. Она возвращает новую функцию, которая при вызове запускает исходную функцию и одновременно таймер. Если исходная функция не успевает завершиться за заданное время, промис отклоняется с ошибкой таймаута.

Пример реализации на JavaScript:

function withTimeout(fn, ms) {
  return function(...args) {
    return new Promise((resolve, reject) => {
      const timer = setTimeout(() => {
        reject(new Error('Timeout'));
      }, ms);

      fn(...args)
        .then(result => {
          clearTimeout(timer);
          resolve(result);
        })
        .catch(err => {
          clearTimeout(timer);
          reject(err);
        });
    });
  };
}

// Использование:
// const fetchWithTimeout = withTimeout(fetch, 5000);
// fetchWithTimeout('https://example.com').then(...).catch(...);

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

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

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

Подробнее