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

61. «5 мин назад» в ленте VK и когда перерисовать подпись

Средняя

Под постом в ленте VK пишут «только что», «7 мин назад», «3 ч назад». Подпись должна обновляться сама, но ставить setInterval на каждую секунду для 200 постов в ленте — лишняя работа: «3 ч назад» не меняется ещё час.

Напишите timeAgo(ts). ts — время поста в мс, текущее время — Date.now(). Пусть d = now − ts; если d < 0 (часы сервера спешат), считайте d = 0.

Текст: d меньше минуты — только что; меньше часа — N мин назад; меньше суток — N ч назад; меньше 7 суток — N дн. назад; дальше — N нед. назад. N — целая часть, округление вниз.

Верните { text, nextIn }, где nextIn — через сколько мс текст изменится: до следующей целой минуты, часа, суток или недели. Компонент ставит один setTimeout(rerender, nextIn) вместо интервала.

В работе: В ленте 200 постов: интервал раз в секунду — 200 перерисовок в секунду, а по nextIn — несколько в минуту на всю ленту.

Пример 1: только что

Аргументы теста
1000000, 12000, "once", 0
Ожидается
{"text": "только что", "nextIn": 48000}

Пример 2: пять минут

Аргументы теста
1000000, 330000, "once", 0
Ожидается
{"text": "5 мин назад", "nextIn": 30000}
Как проверяем Объявите timeAgo — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 9: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function timeAgo(ts) // → { text: string, nextIn: number }
датытаймерыфейковые часыформатирование

Источник: на задачах VK: лента новостей и комментарии. Условие пересказано своими словами.