Храните для ключа результат и срок expiresAt; при обращении возвращайте только неистёкшую запись, иначе вычисляйте заново.
Усложнение задачи с memoize: сделать так, чтобы функция memoize вторым аргументом получала время жизни кэша в миллисекундах, после истечения которого кэш инвалидируется.
Храните для ключа результат и срок expiresAt; при обращении возвращайте только неистёкшую запись, иначе вычисляйте заново.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Храните для ключа результат и срок expiresAt; при обращении возвращайте только неистёкшую запись, иначе вычисляйте заново.
Пример для чистой синхронной функции одного аргумента; объекты сравниваются по ссылке:
function memoize(fn, ttlMs) {
if (!Number.isFinite(ttlMs) || ttlMs < 0) throw new RangeError('ttlMs');
const cache = new Map();
return function (arg) {
const hit = cache.get(arg);
if (hit && Date.now() < hit.expiresAt) return hit.value;
cache.delete(arg);
const value = fn(arg);
cache.set(arg, { value, expiresAt: Date.now() + ttlMs });
return value;
};
}
Инвалидация ленивая: просроченная запись удаляется при следующем обращении. Для неограниченного числа ключей отдельно нужна очистка памяти; this, несколько аргументов и Promise требуют расширения контракта.