Javascript秒表/计时器不稳定

Javascript秒表/计时器不稳定,javascript,timer,Javascript,Timer,我有一个javascript计时器工作不正常。当我将它插入浏览器时,秒数会稍微向后跳。我相信这可能与毫秒在秒/分钟/小时内没有正确转换有关,但我不确定。这是我的密码: var link = userLink + '/games/' + $scope.currentGame; ref.child(link).once('value', function(snapshot) { var game = snapshot.val(); var startTime

我有一个javascript计时器工作不正常。当我将它插入浏览器时,秒数会稍微向后跳。我相信这可能与毫秒在秒/分钟/小时内没有正确转换有关,但我不确定。这是我的密码:

  var link = userLink + '/games/' + $scope.currentGame;
      ref.child(link).once('value', function(snapshot) {
      var game = snapshot.val();
      var startTime = Date.parse(game.started);
      var timeNow = Date.now();
      var timeLapsed = (timeNow - startTime);
      var mydate = new Date(timeLapsed);
      var humandate = mydate.getUTCHours()+ " hours, " + mydate.getUTCMinutes()+ " minutes and " + mydate.getUTCSeconds()+ " second(s)";
      console.log(humandate);
      console.log( mydate.getUTCHours())
      var timeVar = document.getElementById('timer'), seconds = mydate.getUTCSeconds(), minutes = mydate.getUTCMinutes(), hours = mydate.getUTCHours(), time;

      function add() {
        seconds++;
        if (seconds >= 60) {
          seconds = 0;
          minutes++;
            if (minutes >= 60) {
              minutes = 0;
              hours++;
            }
      }
        timeVar.textContent = (hours ? (hours > 9 ? hours : "0" + hours) : "00") +
        ":" + (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") +
        ":" + (seconds > 9 ? seconds : "0" + seconds);
        timer();
      }
      function timer() {
        var time = setTimeout(add, 1000);
      }
      timer();

    });
初始启动时间从firebase数据库抓取,用于持久化。计时器是游戏的一部分,然后以下函数会增加时间。任何帮助都将不胜感激。谢谢。

这一行:

var time = setTimeout(add, 1000);

不是每秒钟执行一次,而是每秒钟执行一次,代码执行时间间隔为+1秒,因此每秒钟至少执行几毫秒。代码运行的时间越长,准确度就越低。尝试使用setInterval一次,而不是每秒调用一次setTimeout,因为它会在您预期的时间触发。

您不能依靠setTimeout来计算秒数或时间。setTimeout只是将函数的执行延迟至少一段时间(以毫秒为单位)。因此,在您的情况下,“添加”函数可能会在1.5秒后运行。这是因为JavaScript与UI在同一个线程中运行,这意味着如果UI线程需要执行另一个任务,它将保留您的函数执行。出于同样的原因,setInterval也不会起作用


您要做的是使用time对象了解自上次调用函数以来实际经过的日期。

1。请使用代码段编辑器创建实际运行的时钟。2.众所周知,JS计时器依赖于其他运行方式,即使这是关于setTimeout的,但这仍然是它的重复:看看这里:看看这是否有助于比较两个日期对象以获得实际经过的时间,并使超时时间变小,如果你想让秒以实际的方式流逝。即使是setInterval也不够。最准确的方法是在每次调用setInterval时设置一个新的超时值,如下所示:setTimeoutadd,1000-Date.now%1000@阿托恩布拉德,他们的行为也差不多。当延迟超过1000毫秒时会发生什么?您将等待很长时间。胆小鬼不说,因为那样会useful@mplungjan是的,好的是,他们的人数比这里所有伟大的人都多,所以。@atornblad这确实有所帮助,但仍然存在问题。计时器现在递增,但现在每隔4秒或5秒跳过一秒,即51、52、53、54、56。。。!有什么建议吗?非常感谢。