Экран обмена валют в Т‑Банке показывает курс USD/RUB, EUR/RUB и ещё десяток пар. Курс меняется часто, поэтому ответ API живёт 30 секунд, а курс по сделке с фиксацией — 5 секунд.
Напишите класс TTLCache. Конструктор new TTLCache({ ttl }) задаёт срок по умолчанию в мс. set(key, value, ttl?) кладёт значение и возвращает this; свой ttl важнее общего. Повторный set перезаписывает значение и срок.
get(key) возвращает значение или undefined, has(key) — true/false. Запись протухает в момент время записи + ttl: ровно в эту миллисекунду её уже нет. get срок не продлевает. delete(key) возвращает, была ли живая запись.
Свойство size — число живых записей. prune() удаляет протухшие записи из памяти и возвращает, сколько удалено. Время берите из Date.now() — в тестах это фейковые часы.
В работе: Курс по сделке держится 5 секунд: если человек нажал «Обменять» на 6-й секунде, курс нужно запросить заново, а не взять из кэша.
Пример 1: живёт ttl мс, на границе уже протух
30000, [["set", "USD", 96.4], ["tick", 29999], ["get", "USD"], ["tick", 1], ["get", "USD"]]
["this", 96.4, "undefined"]
Пример 2: свой ttl для курса по сделке
30000, [["set", "USD", 96.4], ["set", "deal:USD", 96.1, 5000], ["tick", 6000], ["get", "deal:USD"], ["get", "USD"]]
["this", "this", "undefined", 96.4]
TTLCache — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 9: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
class TTLCache { constructor({ ttl }); set(key, value, ttl?); get(key); has(key); delete(key); get size(); prune() }
Источник: на задачах Т‑Банка: обмен валют в приложении. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.