如何实现精准的setTimeout

hykeda2年前JS1798

setTimeout 是不准的。因为 setTimeout 是一个宏任务,它的指定时间指的是:进入主线程的时间。

setTimeout(callback, 进入主线程的时间)

所以什么时候可以执行 callback,需要看 主线程前面还有多少任务待执行

function timer(speed) { 
   counter = 1,  
   start = new Date().getTime();  
   window.setTimeout(function() { instance(speed,counter,start); },speed); 
} 

function instance (speed,counter,start) { 
    //其他自己的逻辑 自己写上去
    

    var real = (counter * speed), //真实执行时间
    ideal = (new Date().getTime() - start); //系统执行时间
    var diff = (ideal - real);//真实执行时间差距
    counter++; //执行次数
    window.setTimeout(function() { instance(speed,counter,start); },(speed - diff)); // 通过系统时间进行修复 ,第二次执行时间变成了执行时间减去误差时间,等于执行时间间隔缩短了。修正了之前的误差
 
}; 

timer(1000);


标签: setTimeout

相关文章

天地图用服务端去调用接口提示403错误,解决办法

天地图用服务端去调用接口提示403错误,这里很有可能就是跨域问题。可以使用天地图官方的处理跨域的地址去处理:https://api.tianditu.gov.cn/apiserver/ajaxprox...

js 对象合并和数组合并

1、对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。let obj1 = {     name:...

JavaScript图片延迟加载微型库Echo.js

JavaScript图片延迟加载微型库Echo.js

JavaScript图片延迟加载微型库Echo.js Echo.js是一个标准的独立的Javascript图片懒加载(延迟加载)库,它非常小巧快速,只有2KB,它使用HT...

生成随机图片

function getMockImagesURL() { let arr = [200, 250, 300, 350, 400, 450]; const width = arr[...

在使用do.js进行js管理时遇到的问题

在使用do.js进行js管理时遇到的问题

Do.js 是一个轻量级的 JavaScript 模块加载器和 DOM 就绪事件处理器,它主要用于管理 JavaScript 和 CSS 文件的异步加载、处理模块依赖关系以及执行 DOM 就绪后的回调...

前端Js自定义相机取景框

https://www.cnblogs.com/sanhuamao/p/14853990.html...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。