Кешируйте Promise первого вызова сразу, чтобы параллельные обращения разделяли одну операцию. Уточните, должна ли ошибка оставаться закешированной.
Адаптируй функцию once для работы с асинхронными функциями (функция может быть как синхронной, так и асинхронной).
Кешируйте 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, это другой контракт: кеш сбрасывают явно и защищают от конкурентного повторного запуска.