如何解决setInterval计时器不准的问题

在js中如果打算使用setInterval进行倒数,计时等功能,往往是不准确的,因为setInterval的回调函数并不是到时后立即执行,而是等系统计算资源空闲下来后才会执行.而下一次触发时间则是在setInterval回调函数执行完毕之后才开始计时,所以如果setInterval内执行的计算过于耗时,或者有其他耗时任务在执行,setInterval的计时会越来越不准,延迟很厉害.

下面的代码可以说明这个问题

var startTime = new Date().getTime();
var count = 0;
//耗时任务
setInterval(function(){
    var i = 0;
    while(i++ < 100000000);
}, 0);
setInterval(function(){
    count++;
    console.log(new Date().getTime() - (startTime + count * 1000));
}, 1000);

代码里输出了setInterval触发时间和应该正确触发时间的延迟毫秒数

176
340
495
652
807
961
1114
1268
1425
1579
1734
1888
2048
2201
2357
2521
2679
2834
2996
......

可以看到延迟是越来越严重的.

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/script/

为了在js里可以使用相对准确的计时功能,我们可以

var startTime = new Date().getTime();
var count = 0;
setInterval(function(){
    var i = 0;
    while(i++ < 100000000);
}, 0);
function fixed() {
    count++;
    var offset = new Date().getTime() - (startTime + count * 1000);
    var nextTime = 1000 - offset;
    if (nextTime < 0) nextTime = 0;
    setTimeout(fixed, nextTime);

    console.log(new Date().getTime() - (startTime + count * 1000));
}
setTimeout(fixed, 1000);

代码里,通过1000(也就是周期时间)减去当前时间和准确时间的差距,来算出下次触发的时间,从而修正了当前触发的延迟.

下面是输出

186
200
230
271
158
899
900
899
900
899
899
899
902
899
418
202
232
266
145
174
192
214
242
268
149
179
214
......

可以看到虽然触发时间并非绝对准确,但由于每次触发都进行及时修正,所以并没有造成误差积累.

作者:cnblogs 小夜 Clifford

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索耗时计算
, count
, 延迟
, setinterval
, 时间
, var
, getTime
, setinterval()
js定时器SetInterval
setinterval计时器、setinterval 时间不准、js setinterval 不准、setinterval 不准、setinterval 休眠问题,以便于您获取更多的相关知识。

时间: 2024-09-02 10:28:30

如何解决setInterval计时器不准的问题的相关文章

setInterval计时器不准的问题解决方法_javascript技巧

在js中如果打算使用setInterval进行倒数,计时等功能,往往是不准确的,因为setInterval的回调函数并不是到时后立即执行,而是等系统计算资源空闲下来后才会执行.而下一次触发时间则是在setInterval回调函数执行完毕之后才开始计时,所以如果setInterval内执行的计算过于耗时,或者有其他耗时任务在执行,setInterval的计时会越来越不准,延迟很厉害. 下面的代码可以说明这个问题 复制代码 代码如下: var startTime = new Date().getTi

Node.js 制作实时多人游戏框架_node.js

在 Node.js 如火如荼发展的今天,我们已经可以用它来做各种各样的事情.前段时间UP主参加了极客松活动,在这次活动中我们意在做出一款让"低头族"能够更多交流的游戏,核心功能便是 Lan Party 概念的实时多人互动.极客松比赛只有短得可怜的36个小时,要求一切都敏捷迅速.在这样的前提下初期的准备显得有些"水到渠成".跨平台应用的 solution 我们选择了node-webkit,它足够简单且符合我们的要求. 按照需求,我们的开发可以按照模块分开进行.本文具体

[Flash基础理论课09]满天星及变幻线[onEnterFrame]

返回"Flash基础理论课 - 目录" 实例1: 思路:1.使用setInterval计时器,不断调用复制星星的函数: 2.每颗星星被创建后,不断减小其自身的_alpha直至0. 步骤1: 绘制星形,保存为影片剪辑,连接->导出->标志符"star". 步骤2: 加入AS代码: var n:Number = 0; //初始化,复制影片的记数器n setInterval(CreateStar, 200); //每200毫秒,调用一次函数CreateStar

JS实现多物体缓冲运动实例代码_javascript技巧

效果: 思路: 利用setInterval计时器进行运动,offsetWidth实现宽度的变动,在用onmouseover将终点和所选中的DIV放入参数再进行缓冲运动. 代码: 复制代码 代码如下: <head runat="server">    <title></title>    <style type="text/css">        div        {            width: 100px

flash 满天星及变幻线

思路:1.使用setInterval计时器,不断调用复制星星的函数:       2.每颗星星被创建后,不断减小其自身的_alpha直至0. 步骤1:     绘制星形,保存为影片剪辑,连接->导出->标志符"star". 步骤2: 加入AS代码: var n:Number = 0; //初始化,复制影片的记数器n setInterval(CreateStar, 200); //每200毫秒,调用一次函数CreateStar() function CreateStar()

js 传递函数: JS中setInterval、setTimeout不能传递带参数的函数的解决办法

在JS中无论是setTimeout还是setInterval,在使用函数名作为调用句柄时都不能带参数,而在许多场合必须要带参数,这就需要想方法解决.一.采用字符串形式:--(缺陷)参数不能被周期性改变setInterval("foo(id)",1000);二.匿名函数包装 (推荐)window.setInterval(function()    {foo (id);    }, 1000);   这样就可以周期性执行foo(id)这个函数,而且把变量id传递进去:三.定义返回无参函数的

Win7系统鼠标光标定位不准或反应慢的解决方法

Win7系统鼠标光标定位不准或反应慢的解决方法   故障一:鼠标定位不准的原因与解决方案 很多光电鼠标会经常无缘无故的出现移位现象,通常这是由于受外界的杂散光影响.一些鼠标为了追求美观外壳漂亮,透光性太好,当光路屏蔽不好加上周围有强光干扰的话,就很容易影响到鼠标内部光信号的传输,干扰脉冲便会导致鼠标误动作的问题.还有一种情况就是温度过高时的晶振或IC工作频率不稳而产生飘移,解决方法只能用同型号.同频率的集成电路或晶振替换. 故障二:鼠标反应慢的问题 表现为光标时好时坏,用手推动连线,光标抖动的问

TSC B-2404条码打印机标签打印位置对不准的解决办法!

台半公司精心推出的TSC B-2404条码打印机拥有低廉的价格.优秀的品质, 提供多种的选购配件,充分满足用户的要求!针对用户经常碰到TSC B-2404打印时每张标签位置对不准的情况,深圳市互信恒科技根据实际中的工作经验,整理出如下的解决方法,希望能够帮到广大用户! 标签打印每张都不一致的话有可能是以下原因引起的: 1.设置的纸与实际纸张不一致 2.打印机未进行测纸 3.打印方式应该设置为有间距的标签 一.标签纸大小确定 标签纸大小确定方法如下图: 二.标签纸大小打印设置 三.TSC B-24

图片-Android中 界面加入计时器 来回切换的过程中 数字跳转的速度越来越快 求解决

问题描述 Android中 界面加入计时器 来回切换的过程中 数字跳转的速度越来越快 求解决 Fragment + ViewPager 切换中 求解决 是他一起在生成新的 让handler多次执行吗 要加判断还是怎么写 求大神帮忙 解决方案 handler 没出完整 我觉得是计时器写法问题啊 他一直在生成新的 要加判断吗 还是 写try catch? 解决方案二: 我没有写过安卓,但根据经验,计时器越来越快的一个原因可能是刷新的时候,前一个计时器没有清空 解决方案三: 多个timer在发送msg