Sobes.tech
Back to questions
Middle
4

Реализуй функцию memoize, которая кэширует результаты вызовов асинхронной функции и не отправляет повторный запрос, если вызов с теми же аргументами уже был сделан.

Companies where asked
Mayflower

Answer from AI

sobes.tech AI

javascript function memoize(asyncFunc) { const cache = new Map();

return async function(...args) { const key = JSON.stringify(args); if (cache.has(key)) { return cache.get(key); } const promise = asyncFunc(...args); cache.set(key, promise); try { const result = await promise; // Можно обновить кэш результатом, если нужно хранить именно результат, а не промис return result; } catch (error) { cache.delete(key); // Удаляем из кэша при ошибке, чтобы повторить вызов throw error; } }; }

// Пример использования: async function fetchData(id) { console.log('Fetching', id); return new Promise(resolve => setTimeout(() => resolve(Data for ${id}), 1000)); }

const memoizedFetch = memoize(fetchData);

memoizedFetch(1).then(console.log); // Запрос отправится memoizedFetch(1).then(console.log); // Вернется из кэша


В этом примере кэш хранит промисы, чтобы при повторных вызовах с одинаковыми аргументами не запускать функцию заново, а возвращать уже выполняющийся или выполненный промис.