Асинхронность. ПродолжениеИспользование промисовmedium

Асинхронная мемоизация с TTL

Реализуйте функцию memoize, которая принимается асинхронную фунцию без аргументов и время (time-to-live), в течение которого кэшируется результат ее работы после завершения промиса.

Пример

Пусть функция работает 1000 мс, а TTL равен 500 мс.

Если мы запустим мемоизированную версию фунции повторно через 700 мс (первый вызов продолжает работать), то второй запуск должен вернуть промис, который зарезолвится через 300 мс тем же результатом, что и промис из первого вызова.

Если мы запустим мемоизированную версию фунции повторно через 1300 мс, то результат так же будет аналогичным, потому что после окончания работы первого вызова прошло 300 мс (из установленных 500 мс).

Если мы запусим мемоизированную версию фунции повторно через 1700 мс, то ответ будет уже другой, потому что прошло больше 1000 + 500 = 1500 мс.

# ----fn---- 1000мс время работы fn # +++++ 500мс время кэширования результата # ↓ — вызовы getDataMemoize # 1, 2 — результаты вызова getData # ↓ ↓ ↓ ↓ ↓ ↓ # 1 1 1 2 2 2 # ------------------------------------------time-> # ----fn----+++++ ----fn----+++++
let count = 0; const getData = async () => { await new Promise((resolve) => setTimeout(resolve, 1000)); return Promise.resolve(++count); }; const getDataMemoize = memoize(getData, 500); getDataMemoize().then(console.log); // 1 getDataMemoize().then(console.log); // 1 setTimeout(() => { getDataMemoize().then(console.log); // 1 }, 700); setTimeout(() => { getDataMemoize().then(console.log); // 1 }, 1300); setTimeout(() => { getDataMemoize().then(console.log); // 2 }, 1700); setTimeout(() => { getDataMemoize().then(console.log); // 2 }, 2000); setTimeout(() => { getDataMemoize().then(console.log); // 2 }, 2900);