[英]Guarantee minimum interval from setInterval
正如您在 output 中看到的那样,差异有时小于 1000,但我的期望总是 >=1000。 有没有办法保证这一点?
var t = Date.now() setInterval(function () { console.log(`Difference`, Date.now() - t) t = Date.now() }, 1000)
看起来间隔确实在每 1000 毫秒后触发,但是下一个计时器在重置t = Date.now()
之前启动的事实正在扭曲差异。 如果您真的关心差异的值,那么您可以将代码更改为以下内容:
var t = Date.now()
const timerFn = function () {
console.log(`Difference`, Date.now() - t)
t = Date.now()
setTimeout(timerFn, 1000)
};
setTimeout(timerFn, 1000)
你的问题可以参考这篇Why use setTimeout to simulation setInterval
let startTime = new Date().getTime();
let count = 0;
// time consuming task
setInterval(function() {
let i = 0;
while (i++ < 1000000000);
}, 0);
setInterval(function() {
count++;
console.log(
"The time difference from the original set interval is:",
new Date().getTime() - (startTime + count * 1000),
"millisecond"
);
}, 1000);
// output:
// Time difference from the original set interval: 699 milliseconds
// Time difference from the original set interval: 771 ms
// Time difference from the original set interval: 887 milliseconds
// The time difference from the original set interval: 981 milliseconds
// Time difference from the original set interval: 1142 milliseconds
// Time difference from the original set interval: 1822 milliseconds
// Time difference from the original set interval: 1891 milliseconds
// The time difference from the original set interval: 2001 milliseconds
// The time difference from the original set interval: 2748 milliseconds
// ...
链接中的作者为此提出了以下解决方法,使用 setTimeout 模拟 setInterval
let timer = null
interval(func, wait){
let interv = function(){
func.call(null);
timer=setTimeout(interv, wait);
};
timer= setTimeout(interv, wait);
},
//2. Use it like setInterval()
interval(function() {}, 20);
//3. Terminate the timer
if (timer) {
window.clearSetTimeout(timer);
timer = null;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.