问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

各位高手好!我有个关于javascript setInterval()的问题?请大家帮帮忙!

发布网友 发布时间:2022-05-17 22:23

我来回答

3个回答

懂视网 时间:2022-05-18 02:44

在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
......

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

热心网友 时间:2022-05-17 23:52

你知道么,执行代码也是需要时间,想想,如果代码执行时间加起来超过了你定义的1000会发生什么?对,那就是在一个周期内可能多次执行你的代码,所以最佳时间是使用setTimeout来回调,详情见《javascript高级程序设计》高级用法那一章

热心网友 时间:2022-05-18 01:10

更新的时间改为1000,代码最好贴出来

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
社保到期了还有时效吗 2023年河北退休人员认证时间 社保待遇资格认证有效期怎么认证 ...语法How long does it take you to get to school? 此句中“it... 海信电视初始设置后无信号 设置海信电视恢复出厂设置搜不到电视信号 海信一族电视大锅恢复设置没信号怎么? 如何用c程序读取txt文件? 成都膨胀螺丝型号 云南农信个人如何开通手机银行 手机号怎样解绑 生育津贴是按月发放吗 山水比德是牛股吗,300844是牛股吗 山水比德雪球财经,300844雪球财经 2016年常州小学教师编制专科生可以考吗 我的专业是学前教育,硕士,想报考常州小学教师,有专业上的*吗? 有高级中学(*)教师资格证的应届本科师范类毕业生,江苏常州人,想考小学语文教师资格证,要怎样? 手机注册的怎么注销 一只手机号注册了两个,想要注销一个怎么注销? 一只手机号注册了两个,想要注销一个怎么注销? 可以注销么?用手机号注册的怎么注销啊? 京东上买新vivox23好,还是二手9成新nex好 可以注销么?用手机号注册的怎么注销啊? 一只手机号注册了两个,想要注销一个怎么注销?注销一个 Htc手机怎么样? htc的手机性能好吗? 你觉得手机htc G8怎么样? 问下HTC G8这手机怎么样 htc手机怎么样 好用吗 HTC G8怎么样? 为啥滕州生育津贴一次性发放济南却要分月 用手机注册的怎么解绑手机号? 推荐几个用手机上的网站吧 用鸡蛋清敷脸之后还要洗脸吗 给个能下手机电影的网站或者论坛 柠檬加蛋清洗脸要敷多久才可以清洗?还是不用清洗? js setInterval问题 种什么植物可以驱蚊? 共享的两台电脑,win10系统。连接打印机的一台可以访问,没有连接打印机的电脑不能访问 刚刚申请的,为什么附近的人看不到我? 我申请了一个新的,为什么附近的人看不到我? 关于*几个点的意思,如何去计算。比如25000如果是两个点的话,是多少钱,怎么计算 买发票的五个点是怎么计算的?有公式吗? 增值税专用发票的点数怎么计算 发票说的几个点怎么算?比如说2个点,怎么开具? 开发票一般点数是指百分点还是千分点 怎样做油条好吃油条制作配方 誓约直播抽奖延迟多少 javascript setInterval 失效 问题 ? 华为青春10手机屏幕设置简易模式退回来微信不见了