Реализуйте функцию asyncMemoize(fn, ttl), которая кеширует результат асинхронной функции fn на ttl миллисекунд.
JSON.stringify(args)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 дважды.