2015-05-19 43 views
-1

我正在尋找一種有效的(非連續輪詢)方式來在實時時鐘轉換到新分鐘時執行函數。我當前的代碼使用setInterval每60秒調用一次函數 - 但實際上有一些滯後,函數調用的平均時間大約爲60.2秒。這導致了我正在開發的一個過程監控系統中累積的累積錯誤。Javascript函數在實時時鐘上執行新分鐘

有沒有人有一個聰明的代碼,以實時時鐘觸發的定期調用函數?

編輯:我被告知通過檢查每次調用函數的時間和補償下一次調用的setInterval值來補償錯誤的方法。這讓我更加接近 - 但我真正追求的是一種根據實時時鐘在新分鐘開始時調用功能的方法...

+0

[setInterval時間慢慢偏離保持準確]的可能重複(http://stackoverflow.com/questions/8173580/setinterval-timing-slowly-drive-away-from-staying-accurate) – Josh

+0

pos sible重複的[如何在JavaScript中創建一個精確的計時器?](http://stackoverflow.com/q/29971898/1048572) – Bergi

回答

2

是的,如果您使用setInterval並帶有間隔如你所見,它最終會開始漂移。但是,您不必持續不斷地進行調查:您只需使用鏈接電話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

是的,我做了,謝謝你的收穫,Bergi。我決定重命名它,以便它更加明確('everyMinute'不一定意味着「一分鐘」),但忘記更改調用, –

+0

另一個好的抓點,Bergi!你讓我停留在腳趾上。 –