Конструктор тарифа МТС пересчитывает цену при каждом движении ползунка гигабайт. Расчёт дорогой, а цены меняются раз в день — кэш на минуту безопасен.
Напишите memoize(fn, ttl). Повторный вызов с теми же аргументами в течение ttl мс после расчёта возвращает сохранённый результат без вызова fn. Начиная с момента расчёт + ttl значение считается заново. Обращение к кэшу срок не продлевает.
Аргументы — строки и числа. Разные наборы аргументов не должны попадать в одну ячейку: ('1,2') и ('1', '2') — разные вызовы.
В работе: Кэш ответов API на клиенте, расчёт цен и скидок, справочники регионов.
Пример 1: повтор внутри ttl
1000, [[0, "msk", "Мой безлимит"], [500, "msk", "Мой безлимит"]]
{"out": [[0, "msk/Мой безлимит#1"], [500, "msk/Мой безлимит#1"]], "calls": 1}Пример 2: ровно через ttl
1000, [[0, "msk", "x"], [1000, "msk", "x"]]
{"out": [[0, "msk/x#1"], [1000, "msk/x#2"]], "calls": 2}memoize — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 6: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function memoize(fn, ttl) // → функция
Источник: на задачах МТС: конструктор тарифа. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.