2015-05-19 2 views
-1

Я ищу эффективный (не непрерывный опрос) способ выполнения функции всякий раз, когда часы реального времени переходят на новую минуту. Мой текущий код использует setInterval для вызова функции каждые 60 секунд, но на практике наблюдается некоторое отставание, и функция вызывается в среднем примерно на 60,2 секунды. Это приводит к кумулятивной ошибке, которая возникает в системе мониторинга процессов, которую я разрабатываю.Выполнение функции Javascript на часах реального времени новая минута

Есть ли у кого-нибудь умный бит кода, который вызывает функцию с регулярными интервалами, вызванными часами реального времени?

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

+0

возможно дубликат [setInterval время медленно отдаляется от пребывания точного] (http://stackoverflow.com/questions/8173580/setinterval-timing-slowly-drifts-away-from-staying-accurate) – Josh

+0

поз Как создать точный таймер в javascript?] (http://stackoverflow.com/q/29971898/1048572) – Bergi

ответ

2

Да, если вы используете setInterval с интервалом 1 минута, он, в конце концов, начнет дрейфовать, как вы заметили. Вам не нужно постоянно опроса, однако: вам просто нужно использовать прикованные звонки до setTimeout. Каждый проверяет себя на часах. Иногда тайм-аут будет 59999, иногда это будет 59997 и т. Д. Но он всегда будет идти в ногу с часами.

function everyMinuteOnTheMinute() { 
    setTimeout(function() { 
     var d = new Date(); 
     console.log(d.getMinutes() + " (" + d.valueOf() % 1000 + ")"); 
     // your "every minute" code goes here 
     everyMinuteOnTheMinute(); 
    }, 60000 - Date.now() % 60000); 
} 

Вы можете превратить это в общую полезность путем добавления обратного вызова:

function everyMinuteOnTheMinute(cb) { 
    setTimeout(function() { 
     cb(); 
     everyMinuteOnTheMinute(cb); 
    }, 60000 - Date.now() % 60000); 
} 

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

everyMinuteOnTheMinute(function() { 
    console.log("Whee, I'm happening every minute on the minute!"); 
}); 
+1

'everyMinute' не является функцией ... Вы имели в виду рекурсивно назвать что-то? – Bergi

+0

Да, я сделал, спасибо за уловку, Берги. Я решил переименовать его так, чтобы он был более явным ('everyMinute' не обязательно означает« на минуту »), но забыл изменить вызов, –

+0

Еще один хороший улов, Берги! Ты держишь меня на ногах. –

 Смежные вопросы

  • Нет связанных вопросов^_^