代码之家  ›  专栏  ›  技术社区  ›  Zafer

用setinterval方法得到一定的频率

  •  0
  • Zafer  · 技术社区  · 15 年前

    在我开发的一个JavaScript代码中,应该每1秒调用一个函数。但为了确保每1秒执行一次此操作,将使用以下代码:

    setInterval(doIt, 500);
    function doIt() {
        var now = (new Date()).getTime();
        if(lastUpdate + 1000 >= now) {
           /// code...
           lastUpdate = now;
        }
    }
    

    据我所知,setinterval(doit,1000)并不总是意味着它每隔一秒钟就被调用一次。

    上述解决方案是否有效?如果没有,你有什么建议?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Pointy    15 年前

    你可以使用 setTimeout 而不是 setInterval ,并在每次调用函数时进行动态调整。其思想是设置足够多毫秒的超时时间,以将您带到下一个秒边界。

    function timeoutFunc() {
      // do interesting things
      var time = new Date().getTime();
      setTimeout(timeoutFunc, 1000 - time % 1000);
    }
    

    你可以从以下开始:

    setTimeout(timeoutFunc, 1000 - new Date().getTime() % 1000);
    

    与服务器同步似乎是一个坏主意,因为您无法知道客户端时钟是否与任何东西(如NTP服务器网络)同步。如果不是,那么服务器同步将使事情看起来 错误的 在客户机上,因为客户机的时钟总是 正确的 .

        2
  •  0
  •   The Surrican    15 年前

    井集间隔是以毫秒为单位定义的。它的意思是每x毫秒。 但是系统可能会冻结或类似的情况! 但是没有实际的更好的解决方案,你的方法是好的。 如果您真的有一个广泛的javascript客户机应用程序,那么结果可能会有点扩展。 一个可能的解决方案是获得系统时间并在函数中使用计数器。然后,只要x次执行与系统时钟对齐,就可以计算到现在为止应该有多少个函数调用,并加快或减慢间隔。 这是你所能达到的完美。但这只需要几毫秒的时间,可能不值得这么做。 我可以问一下你在发展什么吗?