基于网络的计时器

时间:2010-10-06 02:03:00

标签: javascript

无论如何在浏览器中创建一个可变速度计时器,它会为所有操作系统和浏览器提供完全相同的结果吗?如果我想为每个用户每分钟节拍140次,无论他们的电脑速度如何。

我一直在使用javascript setTimeout()和setInterval(),但我认为它们取决于计算机的速度和程序中的代码量。 如何将系统时钟合并到浏览器中?还是其他任何想法?

3 个答案:

答案 0 :(得分:6)

您必须在解决方案中使用setTimeoutsetInterval,但由于以下原因,这将是不准确的:

  1. 浏览器的最小超时时间不是0毫秒。跨浏览器的最小值约为14毫秒。
  2. 定时器不准确。它们代表排队时间,而不是执行时间。如果在计时器触发时正在执行其他操作,则代码会被推送到队列中等待,并且可能直到很久才执行。
  3. 您可能希望使用setTimeout以及手动跟踪当前时间(使用Date)来执行您的计划。对于你的情况,尝试这样的事情:

    function someAction(delta) {
      // ...
    }
    
    function beat() {
      var currentTime = +new Date;
      var delta = currentTime - pastTime;
    
      if (delta > 430) { // 430ms ~ 140bpm
       pastTime = currentTime;
       someAction();
      }
    
      setTimeout(beat, 107); // 4x resolution
    }
    
    var pastTime = +new Date;
    beat();
    

    这应该接近每分钟140次,使用更高的分辨率以避免更大的延迟。这只是一个示例,您可能需要更多地工作以使其为您的应用程序提供最佳性能。

答案 1 :(得分:0)

您可以使用setInterval()或尝试从Date()中获取最佳内容。

请注意,时间不准确,我认为是因为JavaScript的单线程性质。

答案 2 :(得分:0)

setTimeout()setInterval()功能几乎是您最好的功能。这些函数的超时参数以毫秒为单位指定,并且取决于运行浏览器的计算机的整体速度。

然而,这些功能肯定不是硬实时功能,如果浏览器在超时或间隔到期时忙于做其他事情,那么在实际调用回调函数之前可能会有一点延迟。