簡體   English   中英

為什么setTimeout計時器觸發兩次?

[英]Why does the setTimeout timer fire twice?

我有一個超時計時器,它根據系統時鍾在分鍾內觸發。 我不明白的是為什么它每分鍾觸發兩次? 如果您檢查控制台日志,則會觸發兩次http://jsbin.com/vises/3/

function runClock() {

var now = new Date();
var timeToNextTick = (60 - now.getSeconds()) * 1000 - now.getMilliseconds();

console.log((60 - now.getSeconds()* 1000)- now.getMilliseconds());
setTimeout(runClock, timeToNextTick);
}  

// start it
runClock();

這是控制台日志:

在此處輸入圖片說明

javascript計時器不是很准確,這很可能是一個問題,您可以嘗試使用以下方法:
http://fiddle.jshell.net/7ffv00jy/

最大的變化是您要測試timeUntilNextTick是否很小,然后您應該等待一整分鍾(因為無論如何您可能都觸發了其中一個事件。)
您也可能會有超時時間來查找第一分鍾,然后讓“啟動器”功能設置一個間隔。

這是更改后的代碼:

function runClock() {
    var timeToNextTick = msUntilNextMinuteTick();

    if(timeToNextTick < 100)
        timeToNextTick += 60*1000; // Add a full minute to this..
    console.log(new Date().toString() + ": " + timeToNextTick);
    setTimeout(runClock, timeToNextTick);
}

// Separate function, makes it easier to debug
function msUntilNextMinuteTick(){
    var now = new Date();
    return (60 - now.getSeconds()) * 1000 - now.getMilliseconds();    
}

// start it
runClock();

到目前為止,它已經給了我:

Wed Oct 15 2014 13:36:22 GMT+0200 (W. Europe Summer Time): 37035   
Wed Oct 15 2014 13:37:00 GMT+0200 (W. Europe Summer Time): 59790  
Wed Oct 15 2014 13:38:00 GMT+0200 (W. Europe Summer Time): 59789  
Wed Oct 15 2014 13:39:00 GMT+0200 (W. Europe Summer Time): 59789  
Wed Oct 15 2014 13:40:00 GMT+0200 (W. Europe Summer Time): 59789  

(這里重要的部分是開始的日期時間,除了“啟動器”以外,所有時間都以:00秒結尾(如果打印ms部分,則它們可能不會全部以.00000結尾)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM