Почему таймер должен учитывать время, а не число тиков

Задача таймера

Обратный отсчёт должен показывать, сколько времени реально осталось до заданного момента. Для этого надёжнее опираться не на число обновлений экрана, а на разницу между текущим моментом и временем окончания. Если уменьшать счётчик на единицу при каждом обновлении, накапливается погрешность: задержки браузера и приостановка вкладки собьют отображение.

Пример: пользователь запустил отсчёт на 90 секунд, затем переключился на другую вкладку. Браузер приостановил обновления этой страницы, поэтому вместо 90 срабатываний экрана произошло, например, 12. Если таймер вычитает по секунде только при обновлении, после возвращения он покажет 78 секунд, хотя фактически прошло уже 40. Если же остаток вычисляется от зафиксированного времени окончания, пользователь увидит 50 секунд — правильное значение.

Как считается остаток

При запуске таймер определяет момент окончания. Например, для интервала в 10 минут он прибавляет 10 минут к текущему времени. Вам достаточно выбрать длительность и нажать кнопку запуска; вручную вычислять время окончания не нужно.

При каждом обновлении экрана таймер заново вычисляет остаток до времени окончания. Обновление экрана нужно только для того, чтобы показать свежее значение, а не для подсчёта прошедшего времени. Даже если обновления задуманы ежесекундными, фактический промежуток между ними может быть больше или меньше секунды. Поэтому экран просто получает новый остаток, рассчитанный от зафиксированной точки окончания.

Если время истекло, на экране остаётся ноль. Счётчик не продолжает отсчёт отрицательных секунд.

Как проверить состояние

Браузер может реже обновлять неактивную вкладку. При возвращении в ту же открытую вкладку таймер пересчитывает остаток и показывает актуальное значение, но не меньше нуля. Так экран не покажет устаревшее число, которое висело до сворачивания вкладки.

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

Ограничения

Закрытие или перезагрузка страницы сбрасывает таймер. После нового открытия страницы остаток не восстанавливается. Возвращение в ту же открытую неактивную вкладку и открытие страницы заново — это разные ситуации. Если случайно закрыть страницу, интервал придётся задать заново.

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

Поэтому таймер в браузере надёжен как визуальный счётчик на открытой странице, а не как будильник для фонового оповещения. Главное правило: остаток всегда вычисляется от времени окончания, а обновление экрана лишь показывает свежее значение. Это помогает избежать накопленной ошибки и корректно пересчитать состояние после неактивности.