![](/img/trans.png)
[英]Why does setTimeout fire twice in Chrome, but not IE or Firefox?
[英]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.