这是一个非常简单的问题,真的。如果我用 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);
};
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top