@Byrger
Разработчик ПО для платежных систем

Как верно сделать тик 1 секунды?

Подскажите как сделать тик серверного скрипта чтоб он соответствовал 1 секунде реального времени.
Я понимаю что его нужно включать именно в 0мс. Как это верно сделать?

setInterval(moveLoop, 1000);

Не знаю как объяснить точнее, чтоб он срабатывал каждую секунду к примеру 01,02,03...10
А не 01.5, 02.5, 03.5....10.5
  • Вопрос задан
  • 365 просмотров
Пригласить эксперта
Ответы на вопрос 2
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
setTimeout(function(){
   setInterval(moveLoop, 1000);
}, 1000-(+Date.now()%1000));
Ответ написан
Комментировать
@alexeyproject
Вывод с максимально приближенным значением к текущему времени, с корректировкой на время выполнения функции-обработчика
function startTimer(cb) {
    var timer = {running: true};
    
    function interval() {
        if (timer.running === false) return;
        console.log('tick: ', (new Date()).toISOString());
        cb();
        setTimeout(interval, 1100 - (Date.now() + 100) % 1000);
    }
    setTimeout(interval, 1100 - (Date.now() + 100) % 1000);
    return timer;
}

function stopTimer(timer) {
    timer.running = false;
}

// test
function payload() {
    var start = Date.now();
    for (var i = 0; i < 10000000; i++); // нагрузка
    var stop = Date.now();
    console.log('payload:', stop - start)
}

var timer = startTimer(payload);

Обратите внимание на 1100 - (Date.now() + 100) % 1000
Здесь происходит сдвиг от нулевой позиции, чтобы между вызовами таймеров было более 100мс.
Эту цифру можно регулировать. Как известно между вызовами не может быть менее 4мс, поэтому (учитывая небольшой запас) не рекомендую ставить меньше 10мс. При данном значении максимальное время выполнения обработчика, для избежания пропуска таймера, будет 989мс, если обработчик будет выполнятся дольше, то очередной вызов будет пропущен.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы