如何实现精准的setTimeout

hykeda2年前JS1795

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

相关文章

Javascript知识点

1、将1,2,3,4,5转成一,二,三......export function transfromNumber(number){   const ...

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

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

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

19个提高工作效率的JavaScript单行代码

1. 生成随机字符串当我们需要一个唯一id时,通过Math.random创建一个随机字符串简直不要太方便噢!!!const randomString = () ...

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

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

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

js获取键盘事件keyCode都是229原因

今天在操作空格键和enter键时出现键盘keyCode值都是229,导致特定的键盘事件没有触发。经过查询,原来是因为在中文输入法下,使用 keydown 事件时,绝大部分的键盘ASCII码值都是229...

计算两个经纬度之间的距离

PHP计算:#lng为经度,lat为纬度,一定不要弄错了哦 function distance($lat1, $lng1, $lat2, $lng2){ &...

发表评论    

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