Храните значение, флаг наличия кеша и время истечения в замыкании; отдельный флаг позволяет кешировать даже undefined.
Реализуйте функцию memo(fn, lifetime), которая возвращает новую функцию и кэширует результат исходной функции без аргументов на заданное время жизни в миллисекундах. Нужно кэшировать один последний результат, без ключей и Map; повторный вызов в пределах lifetime должен вернуть кэшированный результат.
Храните значение, флаг наличия кеша и время истечения в замыкании; отдельный флаг позволяет кешировать даже undefined.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Храните значение, флаг наличия кеша и время истечения в замыкании; отдельный флаг позволяет кешировать даже undefined.
Вариант для синхронной функции без аргументов: TTL считается после вычисления, исключения не кешируются. lifetime = 0 отключает повторное использование. Кеш общий для одной созданной обёртки.
function memo(fn, lifetime) {
if (!Number.isFinite(lifetime) || lifetime < 0) throw new RangeError('TTL');
let valid = false, value, expires = 0;
return function () {
if (valid && performance.now() < expires) return value;
value = fn.call(this);
expires = performance.now() + lifetime;
valid = true;
return value;
};
}
Для асинхронной функции нужно отдельно согласовать кеширование promise и отказов.