繁体   English   中英

从 setInterval 保证最小间隔

[英]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

  1. 写一个区间方法
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM