setInterval计时器不准的问题解决方法
来源: 阅读:1423 次 日期:2014-05-09 14:54:34
温馨提示: 小编为您整理了“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

......

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

为了在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

......

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

更多信息请查看IT技术专栏

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!

2025国考·省考课程试听报名

  • 报班类型
  • 姓名
  • 手机号
  • 验证码
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map