Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.01.2018, 12:30
Интересующийся
Отправить личное сообщение для Walk Посмотреть профиль Найти все сообщения от Walk
 
Регистрация: 14.08.2017
Сообщений: 28

Скрипт "таймера" отстает, если свернуть браузер или переключиться на другую вкладку
Здравствуйте

Есть довольно простой js-скрипт, аналог таймера, который каждую секунду изменяет цифру на экране:

var time = 1000;
var start_time = 1000; 
// ...другие параметры

            function timer() {
                setTimeout(
                    function run() {
                            second++;
                            view(); // обновляет информацию на экране
                            setTimeout(run, time);
                        }
                    },
                    start_time);
            }


При открытии/обновлении страницы php получает данные о текущем времени, и дальше уже отрабатывает js.

Заметил, что если скрыть браузер, или переключиться на другие вкладки, а потом (минут через 5-10+) вернуться на страницу с таймером, и обновить страницу - то время на несколько десятков секунд "прыгнет" вперед.

Получается, что в этом случае js как бы подлагивает, и считает "время" медленней реального. Знакомый программист, разбирающийся в js сказал, что с этим ничего не поделать. Это так?
Ответить с цитированием
  #2 (permalink)  
Старый 29.01.2018, 12:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

Walk,
секунды надо менять, согласно прошедшему времени, а не относительно сколько раз сработает таймер.
меняйте логику в строке 8.
Ответить с цитированием
  #3 (permalink)  
Старый 29.01.2018, 12:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

Walk,
строка 62, там обратный таймер, но логика таже, изменить вычитание несложно, чтоб время вперёд шло
https://javascript.ru/forum/dom-wind...tml#post476408
Ответить с цитированием
  #4 (permalink)  
Старый 29.01.2018, 13:45
Интересующийся
Отправить личное сообщение для Walk Посмотреть профиль Найти все сообщения от Walk
 
Регистрация: 14.08.2017
Сообщений: 28

Сообщение от рони Посмотреть сообщение
Walk,
строка 62, там обратный таймер, но логика таже, изменить вычитание несложно, чтоб время вперёд шло
https://javascript.ru/forum/dom-wind...tml#post476408
Спасибо за пример.

Нашел немного другой - протестировал - вроде как работает без задержек:

var second = 0;
var interval = 1000;
var expected = Date.now() + interval;

    setTimeout(step, interval);
    
    function step() {
        var dt = Date.now() - expected;
        if (dt > interval) {
            alert('Непредвиденная ошибка'); // ошибка которой не должно быть
        } else {
            
            // выполняем нужный код

            expected += interval;
            setTimeout(step, Math.max(0, interval - dt));
        }
    }
Ответить с цитированием
  #5 (permalink)  
Старый 29.01.2018, 15:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,080

Walk,
вам виднее ...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск