原因:.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定时器不准及解决方案相关推荐

  1. 的setinterval函数_Vue定时器与JS 定时器 setInterval() 和 setTimeout()

    H5前端开发社区专注更多编程教程和电子书天天在用钱在vue中,有两套定时器,一套是浏览器API,window对象上的:另一套就是vue/nodejs封装的,需要引入 import { setInter ...

  2. Vue进阶(七十八):Vue 定时器与 JS 定时器

    文章目录 一.Vue 定时器 二.JS 定时器 一.Vue 定时器 在vue中,有两种定时器,一是浏览器API,window对象上的:另一种就是vue/nodejs封装的,需要引入. import { ...

  3. 【Three.js】关于Three.js的辅助库ststs.js报错的解决方案

    [Three.js](一) 了解Three.js基本的代码样式与运行结果 问题描述 解决方案 关于Three.js的问题,可以与作者共同讨论. 问题描述 作者初学Three.js,需要用到ststs. ...

  4. js 定时器(setTimeout/setInterval)出现变量未定义(xxx is not defined) 的解决方法

    js 定时器(setTimeout/setInterval)出现变量未定义(xxx is not defined) 的解决方法 参考文章: (1)js 定时器(setTimeout/setInterv ...

  5. Python 执行js的2种解决方案-乾颐堂

    Python 执行js的2种解决方案-乾颐堂 参考文章: (1)Python 执行js的2种解决方案-乾颐堂 (2)https://www.cnblogs.com/qytang/p/5580922.h ...

  6. angularJS 路由加载js controller 未定义 解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 说明 本文主要说明,在angularJS框架使用中,angularJS 路由加载js controller 未定义 解决方案. ...

  7. [转]基于 aspnet 的自动合并输出js和css的解决方案

    这是一个基于 aspnet 的自动合并输出js和css的解决方案. 首先感谢 LoveCherry 的文章<httpmodule和httphandler配合的又一应用--合并脚本样式>(h ...

  8. 网页的js源文件被加密解决方案

    网页的js源文件被加密解决方案 Firefox和Chrome都具有这个功能,而且位置几乎一致 posted on 2019-04-30 10:52 凉云 阅读(...) 评论(...) 编辑 收藏 转 ...

  9. js定时器和linux命令locate

    js定时器如果带有参数,应该采用如下方式 setTimeout(function(){function(param)},1000); 匿名函数的方法. linux locate基于数据库的查找方法. ...

最新文章

  1. 一种清除windows通知区域“僵尸”图标的方案——XP系统解决方案
  2. npjsba-2018-用肠道微生物模型指导个性化膳食缓解局部性肠炎
  3. Jenkins插件之环境变量插件EnvInject
  4. CTFshow 信息收集 web8
  5. 10_css控制背景与css精灵.txt
  6. 【若依(ruoyi)】向DAO中传递动态参数
  7. Tensorflow练习题
  8. Rust : wasm尝试 与wasmtime库
  9. 计算机am3代表,拨开重重迷雾 AMD处理器历代接口解谜
  10. SLAM | 视觉SLAM中直接法开源算法:LSD-SLAM、DSO
  11. 基于JavaWeb的餐厅点餐系统设计与实现
  12. 网页怎么与服务器进行连接,如何实现网页与服务器的连接
  13. 论文脚注的冷知识你都知道了么?
  14. jsonobject返回map_如何把JSON对象转为map对象
  15. 关于瓦力机器人的设计构想
  16. 同花顺_知识_庄家技法_5出货技法
  17. vue项目中预览pdf文件
  18. 继SDS之后又迎来CDM,存储行业真要变天了?
  19. ixia测试工具的全称_[转载] IXIA网络性能测试仪
  20. [k8s]gosu使用

热门文章

  1. Django+Vue前后端分离项目
  2. c#使用ShellExecute
  3. JavaScript 利用indexOf去重
  4. springboot 调用shell脚本,支持传参
  5. 解决“ERROR:database “xxx“ is being accessed by other users“
  6. FFMPEG在Windows下使用Movie滤镜读取文件失败问题
  7. xsl php,Centos下给PHP开启xsl扩展
  8. Oracle GoldenGate技术
  9. Redis操作 入门个人总结
  10. django文件上传到服务器,django上传文件的三种方式