Напиши функцию once, которая принимает функцию в качестве параметра и возвращает результат её первого выполнения, даже если вызвать её много раз.

Сохраните исход первого запуска и при следующих вызовах возвращайте его, не выполняя функцию заново.

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

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

Сохраните исход первого запуска и при следующих вызовах возвращайте его, не выполняя функцию заново.

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

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

Сохраните исход первого запуска и при следующих вызовах возвращайте его, не выполняя функцию заново.

Здесь кешируется также синхронная ошибка, а рекурсивный вызов во время первого выполнения запрещён. Promise сохраняется как результат, включая возможное отклонение.

function once(fn) {
  let state = 'new', result, failure;
  return function (...args) {
    if (state === 'done') return result;
    if (state === 'failed') throw failure;
    if (state === 'running') throw new Error('Повторный вход');
    state = 'running';
    try {
      result = fn.apply(this, args);
      state = 'done';
      return result;
    } catch (error) {
      failure = error;
      state = 'failed';
      throw error;
    }
  };
}

Аргументы и this последующих вызовов уже не влияют на результат. Отдельное состояние позволяет кешировать undefined, false и 0.

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

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

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

Подробнее