Сохраните исход первого запуска и при следующих вызовах возвращайте его, не выполняя функцию заново.
Напиши функцию 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.