Адаптируй функцию once для работы с асинхронными функциями (функция может быть как синхронной, так и асинхронной).

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

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

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

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

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

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

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

Здесь любой результат приводится к Promise, а rejection тоже сохраняется:

function once(fn) {
  let called = false;
  let result;
  return function (...args) {
    if (!called) {
      called = true;
      result = Promise.resolve().then(() => fn.apply(this, args));
    }
    return result;
  };
}

Синхронный throw превращается в rejection; this и аргументы берутся из первого вызова. Если после ошибки нужен retry, это другой контракт: кеш сбрасывают явно и защищают от конкурентного повторного запуска.

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

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

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

Подробнее