Асинхронный memoize с TTL

Hard
PromiseCacheAsyncOzon

Реализуйте функцию asyncMemoize(fn, ttl), которая кеширует результат асинхронной функции fn на ttl миллисекунд.

  • Ключ кеша — JSON.stringify(args)
  • Повторный вызов с теми же аргументами до истечения TTL возвращает кешированный результат
  • После истечения TTL функция вызывается заново
const memoFetch = asyncMemoize(fetchData, 5000);
await memoFetch("url"); // вызов fn
await memoFetch("url"); // из кеша (fn не вызывается)
Подсказка

Заведите Map, ключ — JSON.stringify(args), значение — { value, ts }. В начале каждого вызова проверяйте Date.now() - ts < ttl — если свежий, возвращайте закешированное значение.

Подсказка

Что ещё могут спросить: что если два вызова придут одновременно до получения ответа (cache stampede)? Решение — кешировать сам промис, а не результат: cache.set(key, fn(...args)) — тогда повторный вызов вернёт тот же промис, не запуская fn дважды.

Ваш код - JavaScript
Результаты
Нажмите «Запуск» для выполнения кода