如何实现精准的setTimeout

hykeda2年前JS1925

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

相关文章

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

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

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

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

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

js 对象合并和数组合并

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

生成随机图片

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

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

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

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

ES6导出、导入模块方式

ES6使用 export 和 import 来导出、导入模块 。export导出的,导入需要用{}var firstName = 'Michael';var lastName = &#...

发表评论    

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