JS定时器不准及解决方案
原因:.Eventloop 循环机制中,异步事件 setInterval 到时后会把回调函数放入消息队列中,主线程的任务执行完毕后依次执行消息队列的任务,由于消息队列中存在大量任务,其他任务执行时间就会造成定时器回调函数的延迟,如果不处理则会一直叠加延迟
示例:
var startTime = new Date().getTime();
var count = 0;
//耗时任务
setInterval(function(){var i = 0;while(i++ < 100000000);
}, 0);setInterval(function(){count++;console.log(count + ' --- ' + (new Date().getTime() - (startTime + count * 1000)));
}, 1000);
示例输出:
解决方案1: 动态计算时差
根据定时器最开始时间计算当前时间(回调函数执行时间)与开始时间的误差,用期望时差减误差作为下一次任务的时间间隔
注:时差过大(超过期望时差)时,由于无法时间回流。。。只能按没有间隔处理,减轻影响
var startTime = new Date().getTime();
var count = 0;
//耗时任务
setInterval(function(){var i = 0;while(i++ < 100000000);
}, 0);
function handle() {count++;var offset = new Date().getTime() - (startTime + count * 1000);var nextTime = 1000 - offset;if (nextTime < 0) nextTime = 0;setTimeout(handle, nextTime);console.log(count + ' --- ' + (new Date().getTime() - (startTime + count * 1000)));
}
setTimeout(handle, 1000);
输出结果:
解决方案2: 使用 web Worker
将定时函数作为独立线程执行
<script type="text/javascript">
var startTime = new Date().getTime();
var count = 0;
//耗时任务
setInterval(function(){var i = 0;while(i++ < 100000000);
}, 0);// worker 解决方案
let worker = new Worker('./worker定时器.js')
</script>
// worker定时器.js
var startTime = new Date().getTime();
var count = 0;
setInterval(function(){count++;console.log(count + ' --- ' + (new Date().getTime() - (startTime + count * 1000)));
}, 1000);
输出结果:
JS定时器不准及解决方案相关推荐
- 的setinterval函数_Vue定时器与JS 定时器 setInterval() 和 setTimeout()
H5前端开发社区专注更多编程教程和电子书天天在用钱在vue中,有两套定时器,一套是浏览器API,window对象上的:另一套就是vue/nodejs封装的,需要引入 import { setInter ...
- Vue进阶(七十八):Vue 定时器与 JS 定时器
文章目录 一.Vue 定时器 二.JS 定时器 一.Vue 定时器 在vue中,有两种定时器,一是浏览器API,window对象上的:另一种就是vue/nodejs封装的,需要引入. import { ...
- 【Three.js】关于Three.js的辅助库ststs.js报错的解决方案
[Three.js](一) 了解Three.js基本的代码样式与运行结果 问题描述 解决方案 关于Three.js的问题,可以与作者共同讨论. 问题描述 作者初学Three.js,需要用到ststs. ...
- js 定时器(setTimeout/setInterval)出现变量未定义(xxx is not defined) 的解决方法
js 定时器(setTimeout/setInterval)出现变量未定义(xxx is not defined) 的解决方法 参考文章: (1)js 定时器(setTimeout/setInterv ...
- Python 执行js的2种解决方案-乾颐堂
Python 执行js的2种解决方案-乾颐堂 参考文章: (1)Python 执行js的2种解决方案-乾颐堂 (2)https://www.cnblogs.com/qytang/p/5580922.h ...
- angularJS 路由加载js controller 未定义 解决方案
2019独角兽企业重金招聘Python工程师标准>>> 说明 本文主要说明,在angularJS框架使用中,angularJS 路由加载js controller 未定义 解决方案. ...
- [转]基于 aspnet 的自动合并输出js和css的解决方案
这是一个基于 aspnet 的自动合并输出js和css的解决方案. 首先感谢 LoveCherry 的文章<httpmodule和httphandler配合的又一应用--合并脚本样式>(h ...
- 网页的js源文件被加密解决方案
网页的js源文件被加密解决方案 Firefox和Chrome都具有这个功能,而且位置几乎一致 posted on 2019-04-30 10:52 凉云 阅读(...) 评论(...) 编辑 收藏 转 ...
- js定时器和linux命令locate
js定时器如果带有参数,应该采用如下方式 setTimeout(function(){function(param)},1000); 匿名函数的方法. linux locate基于数据库的查找方法. ...
最新文章
- 一种清除windows通知区域“僵尸”图标的方案——XP系统解决方案
- npjsba-2018-用肠道微生物模型指导个性化膳食缓解局部性肠炎
- Jenkins插件之环境变量插件EnvInject
- CTFshow 信息收集 web8
- 10_css控制背景与css精灵.txt
- 【若依(ruoyi)】向DAO中传递动态参数
- Tensorflow练习题
- Rust : wasm尝试 与wasmtime库
- 计算机am3代表,拨开重重迷雾 AMD处理器历代接口解谜
- SLAM | 视觉SLAM中直接法开源算法:LSD-SLAM、DSO
- 基于JavaWeb的餐厅点餐系统设计与实现
- 网页怎么与服务器进行连接,如何实现网页与服务器的连接
- 论文脚注的冷知识你都知道了么?
- jsonobject返回map_如何把JSON对象转为map对象
- 关于瓦力机器人的设计构想
- 同花顺_知识_庄家技法_5出货技法
- vue项目中预览pdf文件
- 继SDS之后又迎来CDM,存储行业真要变天了?
- ixia测试工具的全称_[转载] IXIA网络性能测试仪
- [k8s]gosu使用
热门文章
- Django+Vue前后端分离项目
- c#使用ShellExecute
- JavaScript 利用indexOf去重
- springboot 调用shell脚本,支持传参
- 解决“ERROR:database “xxx“ is being accessed by other users“
- FFMPEG在Windows下使用Movie滤镜读取文件失败问题
- xsl php,Centos下给PHP开启xsl扩展
- Oracle GoldenGate技术
- Redis操作 入门个人总结
- django文件上传到服务器,django上传文件的三种方式