javascript setInterval未按时运行

我写了一个无法正常工作的计时器方法。 它应该显示在表单上经过的时间,但是它按2或3计数而不是每秒计数一次。 什么可能导致这种行为,我该如何解决?

我的代码:

function startTimer() { var minutes, seconds; setInterval(function () { if (!isPaused) { minutes = parseInt(timer / 60, 10); seconds = parseInt(timer % 60, 10); minutes = minutes < 10 ? "0" + minutes : minutes; seconds = seconds < 10 ? "0" + seconds : seconds; $('#TimeLabel').text("Form Time: " + minutes + ":" + seconds); ++timer; } }, 1000); } 

上面的代码显示“表格时间:00:01”,然后是“表格时间:00:04”,然后是“表格时间:00:07”等。

这是我想出的一个例子。 它使用时间,以便不依赖于setInterval的准确性。 希望这可以帮助!

 function startTimer(){ var minutes, seconds; var startTime = new Date; setInterval(function(){ var currentTime = new Date; seconds = currentTime.getSeconds() - startTime.getSeconds(); if(seconds < 0){ seconds += 60; }else if(seconds === 0){ minutes = currentTime.getMinutes() - startTime.getMinutes(); } console.log(minutes + ':' + seconds); }, 100); } startTimer(); 

它取决于javascript的异步性质以及它在单个线程上运行的事实。

网上有很多文章解释了事件循环是如何工作的,因此,我认为没有必要在这里解释它。

您只需要记住: setTimeoutsetInterval或其他类似的指令将在作为参数传递的delay time之后的第一个可用时间执行。

所以, window.setTimeout(function() { console.log('Hello World'); }, 1000); 并不意味着将在1000ms(1s)后完全执行。

它基本上意味着等待100ms,当事件循环是空闲时,调用作为参数传递的回调。

进一步阅读

问题可能与不声明所有变量有关。 当我在控制台中运行此版本时,它可以正常工作:

 function startTimer() { var minutes, seconds, isPaused = false, timer = 1; setInterval(function () { if (!isPaused) { minutes = parseInt(timer / 60, 10); seconds = parseInt(timer % 60, 10); minutes = minutes < 10 ? "0" + minutes : minutes; seconds = seconds < 10 ? "0" + seconds : seconds; console.log("Form Time: " + minutes + ":" + seconds); timer++; } }, 1000); } startTimer(); 

我刚刚在控制台中使用了代码,发现它工作正常,代码是:

  var timer =1; var minutes, seconds; setInterval(function () { minutes = parseInt(timer / 60, 10); seconds = parseInt(timer % 60, 10); minutes = minutes < 10 ? "0" + minutes : minutes; seconds = seconds < 10 ? "0" + seconds : seconds; console.log("Form Time: " + minutes + ":" + seconds); ++timer; }, 1000); 

因此可能会有一些东西会增加计时器的值或确保你的函数startTimer只调用一次。