题
这是一个非常简单的问题,真的。如果我用 setInterval(something, 1000)
, 我能完全确定之后,说31日子里它会触发了"什么"究竟 60*60*24*31
时间?或是有任何风险对于所谓的漂流?
解决方案
下面是你可以在Firefox上运行的基准:
var start = +new Date();
var count = 0;
setInterval(function () {
console.log((new Date() - start) % 1000,
++count,
Math.round((new Date() - start)/1000))
}, 1000);
首先值应尽量接近0或1000作为可能的(任何其他值显示了如何“关闭点”的触发的时机。)第二个值是代码已被触发的次数,和第三值是多少次可能的应的已被触发。你会注意到,如果你霸占了你的CPU就可以得到相当离开现场,但它似乎自行解决。尝试运行一段较长的时间,看看它是如何处理。
其他提示
简短的回答:不,你不能肯定。是的,它可以漂移。
只要回答:约翰Resig上 准确性的JavaScript时间 和 如何JavaScript工作的计时器.
从第二条:
为了了解如何计工作在内部还有一个重要的概念,需要加以探讨:定时延迟是不能保证。由于所有JavaScript在浏览器上执行一个单一的线步的事件(例如鼠标点击和定时器)是唯一运行的时候有一个开放的执行。
这两篇文章(和任何在该网站上)是巨大的阅读,所以它。
(对不起我的英文不好) 我有同样的问题,大约倒计时功能,我所著的功能倒计时()和环路在使用setInterval但其漂流每循环1-3毫秒。然后,我写控制功能是否有任何漂移和固定它。
它与真正的分和秒只控制。这里是。它的优良工程对我来说,我希望它会帮助你。
$.syncInterval(functionname,interval,controlinterval)
示例:
countdown(){ some code };
$.syncInterval(countdown,1000,60);
它说运行倒计时功能每1000毫秒,并检查它每60秒
这里是代码:
$.syncInterval = function (func,interval,control) {
var
now=new Date();
realMinute=now.getMinutes(),
realSecond=now.getSeconds(),
nowSecond=realSecond,
nowMinute=realMinute,
minuteError=0,
countingVar=1,
totalDiff=0;
var loopthat = setInterval(function(){
if (nowSecond==0) {
nowMinute++;
nowMinute=nowMinute%60;
};
if (countingVar==0){
now=new Date();
realSecond=now.getSeconds();
realMinute=now.getMinutes();
totalDiff=((realMinute*60)+(realSecond))-((nowMinute*60)+(nowSecond));
if(totalDiff>0){
for (i=1;i<=totalDiff;i++) {
func();
nowSecond++;
countingVar++;
};
} else if (totalDiff==0){
func();
nowSecond++;
countingVar++;
} else if (totalDiff<0) {
};
} else {
func();
nowSecond++;
countingVar++;
};
countingVar=countingVar%control;
nowSecond=nowSecond%60;
},interval);
};
不隶属于 StackOverflow