我写的每分钟调用一个函数的代码,我认为是有缺陷的,因为它有一段时间的好处,但是自页面加载以来每小时往往会落后大约15秒.说实话,我无法弄清楚导致滞后的原因,可能是执行功能所需的时间,小的失误都会累积和累积.有没有办法自动纠正函数内的失误.或者也许有人知道在分钟函数调用上实现更好的方法.任何帮助或想法非常感谢.谢谢.
var now = new Date();
var delay = 60 * 1000; // 1 min in msec
var start = delay - (now.getSeconds()) * 1000 + now.getMilliseconds();
setTimeout(function setTimer() {
onTheMinFunc();
setTimeout(setTimer, delay);
}, start);
Run Code Online (Sandbox Code Playgroud)
首先,DOM Timers API不保证准确性.我引述:
此API不保证计时器将按计划运行.由于CPU负载,其他任务等导致的延迟是预期的.
其次,由于onTheMinFunc()执行时间而导致每一轮都有延迟(只有在完成时才设置超时).
所以,让我们说onTheMinFunc需要半秒才能执行 - 你每分钟都会得到半秒钟的延迟而且会累积 - 只需要10分钟就可以延迟一段时间.(注意,函数通常不应超过15ms才能执行以避免明显滞后)
尝试:
setInterval(onTheMinFunc, delay);
Run Code Online (Sandbox Code Playgroud)
它仍然不会很准确.您可以在更短的时间间隔内轮询并跟踪日期变量 - 但同样 - 无法保证.