setInterval的问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了setInterval的问题。相关的知识,希望对你有一定的参考价值。

setInterval(function()
alert("Hello world!");
,1000));

这段代码是每一秒执行一次函数。那这每一秒是执行完函数后开始算起,还是执行函数的同时就开始算起。如果是执行完函数后开始算起,岂不是有时间误差了,因为还要算上执行函数的时间,虽然这时间只有一点点。

参考技术A 不是执行后算起,这是定时器,每1000毫秒调用一次函数,如果函数需要执行很久,可能会造成重入,那时我们需要使用setTimeout。追问

说得好。可是如果函数需要执行很久,用 setTimeout 的话,岂不是不能间歇调用了,那是超时调用。

追答

反正就这两个函数,需要准时每妙启动一次任务的使用setInterval,要注意防止重入,如果需要每次任务执行完毕后间隔1秒再次启动的就使用setTimeout。

参考技术B 尽量使用setTimeout来代替setInterval
下面是个例子,加入你计划每1000毫秒执行一次

function start()
(function()
var before = new Date().getTime();
//在这是你的执行的命令
xxxxxx
var delay = 1000-(new Date().getTime()-before);
setTimeout(arguments.callee,delay);

)();


使用setInterval不太好控制,一旦出错不容易结束。
参考技术C 有if判断一点当前时间啊。。。。。。

var s=new Date().getSeconds();
function a()
if(new Date().getSeconds()!=s)alert(s);
s=new Date().getSeconds();
;
setInterval(a,1);

//这样可以就了 一秒调用一次 无误差

如何在Angularjs上使用setInterval [重复]

【中文标题】如何在Angularjs上使用setInterval [重复]【英文标题】:How to use setInterval on Angularjs [duplicate] 【发布时间】:2013-10-14 01:09:44 【问题描述】:

我正在编写一个小测验应用程序,我需要在其中向用户显示经过时间的计时器。我没有看到 setInterval() 的任何包装器。使用 window.setInterval 看起来很尴尬。是否有一种干净的 Angular 方式来更新时间?

【问题讨论】:

几乎相同的问题,完全相同的答案:***.com/questions/14237070/… @see siddii.github.io/angular-timer @Philipp - 我也看到了那个帖子,但是那个解决方案看起来是反语义的。我只是想知道是否存在更好的解决方案。 不,但是您也可以在其中使用范围进行 setInerval.$apply,$timeout 只是没有 inteval 方法,只有超时。 【参考方案1】:

我建议将“尴尬”代码包装在一些帮助模块中。请记住 $apply() 您的更改,以便 AngularJS 可以更新绑定。

// helper code
    var applyIfPossible = function (scope, fn) 
        if (!scope.$root.$$phase) 
            scope.$apply(function () 
                fn();
            );
         else 
            fn();
        
    ;

    function setupInterval(scope, timeSpanInMilliseconds) 
        var intervalHandler = window.setInterval(function()
            applyIfPossible(scope, intervalCallbackFn);
        , timeSpanInMilliseconds);

        var unregisterDestroyHandler = null;
        unregisterDestroyHandler = scope.$on('$destroy', ()=> 
            window.clearInterval(intervalHandler);
            unregisterDestroyHandler();
        );

        scope = null;

        return function clearInterval() 
            unregisterDestroyHandler();
            window.clearInterval(intervalHandler);
        
    



// app code
var stopInterval = setupInterval(scope, 200, update); // update does you repeated stuff

// later on
stopInterval();

【讨论】:

我想过这个,但这看起来仍然很乱。顺便说一句,您需要确保在视图被销毁时调用 cancelInterval()。否则,即使您移出此范围,此方法仍会继续执行。 使用 $interval(检查文档)而不是 setInterval

以上是关于setInterval的问题。的主要内容,如果未能解决你的问题,请参考以下文章

setTimeout与setInterval对比

js——定时器

js の 计时器

使用JavaScript制作页面特效2

java script中如何让一个alert每隔10秒出现一次

关于setInterval()的一个问题