讨论数量:
用本地时间修正呀,比如这样:
//js倒计时函数
function timeout(second,callback){
let start_time=(new Date()).getTime();
let t = setInterval(function(){
if((new Date()).getTime()-start_time>second*1000){
callback();
clearInterval(t);
}
},100);
}
//调用示例:5秒后执行
timeout(5,function () {
console.log('时间到啦');
});
首先,js是单线程的,无法消除误差,前端能做的只能是减少误差
然后,可以 setTimeout 系统时间补偿入手
简单的代码:
/**
* 比较稳定地计数
* @param fn 自定义函数
* @param speed
*/
const superSetTimeout = (fn, speed) => {
fn();
let counter = 1;
let start = new Date().getTime();
const main = () => {
fn();
let ideal = counter * speed;
let real = new Date().getTime() - start;
counter++;
const diff = real - ideal;
setTimeout(() => {
main();
}, speed - diff); // 通过系统时间进行修复
};
setTimeout(() => {
main();
}, speed);
};
superSetTimeout(() => {
console.log(new Date());
}, 1000);
网上也有很多类似代码
推荐文章: