Войти Регистрация
Фронтенд

8. Кэш расчёта тарифа МТС на N миллисекунд

Средняя

Конструктор тарифа МТС пересчитывает цену при каждом движении ползунка гигабайт. Расчёт дорогой, а цены меняются раз в день — кэш на минуту безопасен.

Напишите 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) // → функция
замыканиякэшвремя

Источник: на задачах МТС: конструктор тарифа. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.