setInterval的问题。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了setInterval的问题。相关的知识,希望对你有一定的参考价值。
setInterval(function()
alert("Hello world!");
,1000));
这段代码是每一秒执行一次函数。那这每一秒是执行完函数后开始算起,还是执行函数的同时就开始算起。如果是执行完函数后开始算起,岂不是有时间误差了,因为还要算上执行函数的时间,虽然这时间只有一点点。
说得好。可是如果函数需要执行很久,用 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的问题。的主要内容,如果未能解决你的问题,请参考以下文章