Javascript 重复设置超时
我试图每10秒重复一次Javascript 重复设置超时,javascript,settimeout,Javascript,Settimeout,我试图每10秒重复一次setTimeout。我知道默认情况下,setTimeout只等待一次,然后执行一次操作。我如何重复这个过程 setTimeout(function() { setTimeout(function() { console.log("10 seconds"); }, 10000); }, 10000); 也许您应该使用setInterval()可能就是您想要的,但是如果您想使用setTimeout()获得相同的效果: 或者,如果您不想声明一个单独的函数,并且
setTimeout
。我知道默认情况下,setTimeout
只等待一次,然后执行一次操作。我如何重复这个过程
setTimeout(function() {
setTimeout(function() {
console.log("10 seconds");
}, 10000);
}, 10000);
也许您应该使用setInterval()
可能就是您想要的,但是如果您想使用setTimeout()
获得相同的效果:
或者,如果您不想声明一个单独的函数,并且希望坚持使用函数表达式,则需要将其设置为命名函数表达式:
setTimeout(function doSomething() {
console.log("10 seconds");
setTimeout(doSomething, 10000);
}, 10000);
(如果您不介意使用不推荐的语言功能,也可以使用。)与@nnnnnn和@uzyn提供的答案不同,我不鼓励您使用
setInterval
,原因如下所述。而是使用以下增量计时脚本:
function DeltaTimer(render, interval) {
var timeout;
var lastTime;
this.start = start;
this.stop = stop;
function start() {
timeout = setTimeout(loop, 0);
lastTime = + new Date;
return lastTime;
}
function stop() {
clearTimeout(timeout);
return lastTime;
}
function loop() {
var thisTime = + new Date;
var deltaTime = thisTime - lastTime;
var delay = Math.max(interval - deltaTime, 0);
timeout = setTimeout(loop, delay);
lastTime = thisTime + delay;
render(thisTime);
}
}
上面的脚本运行给定的渲染
函数,尽可能接近指定的间隔
,为了回答您的问题,它使用设置超时
重复一个过程。在您的情况下,您可以执行以下操作:
var timer = new DeltaTimer(function (time) {
console.log("10 seconds");
}, 10000);
var start = timer.start();
在我看来,setInterval()是您的最佳选择。
下面是一些代码:
setInterval(function() {
//your code
}, 10000);
// you can change your delay by changing this value "10000".
下面是一个使用setTimeout的函数,它试图调用自己,使其尽可能接近一个常规间隔。如果观察输出,可以看到时间漂移和重置
<script type="text/javascript">
function Timer(fn, interval) {
this.fn = fn;
this.interval = interval;
}
Timer.prototype.run = function() {
var timer = this;
var timeDiff = this.interval;
var now = new Date(); // Date.now is not supported by IE 8
var newInterval;
// Only run if all is good
if (typeof timer.interval != 'undefined' && timer.fn) {
// Don't do this on the first run
if (timer.lastTime) {
timeDiff = now - timer.lastTime;
}
timer.lastTime = now;
// Adjust the interval
newInterval = 2 * timer.interval - timeDiff;
// Do it
timer.fn();
// Call function again, setting its this correctly
timer.timeout = setTimeout(function(){timer.run()}, newInterval);
}
}
var t = new Timer(function() {
var d = new Date();
document.getElementById('msg').innerHTML = d + ' : ' + d.getMilliseconds();
}, 1000);
window.onload = function() {
t.run();
};
</script>
<span id="msg"></span>
功能计时器(fn,间隔){
这个.fn=fn;
这个。间隔=间隔;
}
Timer.prototype.run=函数(){
var定时器=此;
var timeDiff=此时间间隔;
var now=new Date();//IE 8不支持Date.now
var新区间;
//只有在一切都好的情况下才跑步
if(typeof timer.interval!=“未定义”&&timer.fn){
//第一次跑步时不要这样做
如果(计时器上次时间){
timeDiff=now-timer.lastTime;
}
timer.lastTime=现在;
//调整间隔
newInterval=2*timer.interval-timeDiff;
//做吧
timer.fn();
//再次调用函数,将其设置为正确
timer.timeout=setTimeout(函数(){timer.run()},newInterval);
}
}
var t=新计时器(函数(){
var d=新日期();
document.getElementById('msg').innerHTML=d+':'+d.getMillimes();
}, 1000);
window.onload=函数(){
t、 run();
};
使用jQuery,您可以这样做:
函数更新页(){
var interval=setTimeout(updatePage,10000);//10'秒
$('a[href]')。单击(函数(){
$(此).data('clicked',true);
clearInterval(interval);//单击任何href链接时清除
console.log('Interval Cleared!');
});
//替换您要执行的“您的函数\u名称”函数
setTimeout(你的函数名,500);
}//函数updatePage关闭语法
updatePage();//再次调用该函数。
最简单,但不是有效的方法 一些可能有用的附加文档:哈哈,好的,谢谢。我没有意识到setinterval和SetTimeOut都有延迟。你甚至没有提供替代方案。需要使用重复的
setTimeout
而不是setInterval
。您只说了明显的,这很好,因为有时它并不明显,但没有提供原始问题的实际答案。不要使用参数。被调用方
会降低性能,只需命名您的函数并使用该名称即可。当然,它在IE中不起作用,但我认为这是一个很好的折衷办法。@AaditMShah“在IE中不起作用”是什么意思?命名函数表达式(甚至有缺陷),但它们肯定“有效”。@AaditMShah-我同意RobG的观点。但是假设如果它在IE中根本不起作用,那么忽略一个拥有巨大市场份额的浏览器怎么会是一个“好的妥协”?无论如何,您可以看到我只是在事后才提到了参数。被调用方
:我包含它主要是为了链接到它上面讨论递归函数表达式的MDN页面。你真的认为你提到的性能降低与10秒的延迟有关吗?或者在任何基于超时的算法中,它根本不是递归吗?@nnnnnn-它与递归无关。使用arguments.callee
会使解释器很难内联函数。在这种情况下,它当然不会产生巨大的影响,但在关键的地方(比如在以60 fps的速度运行的游戏循环中),它肯定会导致延迟。除了命名函数表达式外,它看起来更干净,我不太喜欢旧版本的IE。它们甚至不能运行HTML5游戏。新版本终于开始符合标准了。你的函数并没有按照你的想法去做<代码>循环在第一次调用后以零间隔被调用。@RobG-我不同意。当您调用start
时,它首先以0
ms的延迟调用循环。但是浏览器通常指定4
ms的最小延迟。之后,它会调整延迟,以便始终以固定的时间间隔调用它。你不必相信我的话。请参阅下面的日志,其中记录了与计时器每秒启动时间的时差。将代码复制并粘贴到IE 8(并将Date.替换为new Date()
,因为非ES5浏览器不支持它)会导致函数在第一次调用后立即运行,而不会等待。确定,发现了问题。在IE 8中,除了将Date.now
替换为new Date()
之外,还需要lastTime=new Date(thisTime.getTime()+延迟)代码>因为答案中的那行结果为NaN
。顺便说一句,这些更改也应该适用于其他浏览器。你需要进行更广泛的测试。否则,您的答案是好的。@RobG-我可以这样做,或者我可以搜索所有Date.now()
并将其替换为+new Date
。这两个都是相同的。这个问题可能是相关的:注意,这会将函数体调度为在c的10000milis延迟后执行
<script type="text/javascript">
function Timer(fn, interval) {
this.fn = fn;
this.interval = interval;
}
Timer.prototype.run = function() {
var timer = this;
var timeDiff = this.interval;
var now = new Date(); // Date.now is not supported by IE 8
var newInterval;
// Only run if all is good
if (typeof timer.interval != 'undefined' && timer.fn) {
// Don't do this on the first run
if (timer.lastTime) {
timeDiff = now - timer.lastTime;
}
timer.lastTime = now;
// Adjust the interval
newInterval = 2 * timer.interval - timeDiff;
// Do it
timer.fn();
// Call function again, setting its this correctly
timer.timeout = setTimeout(function(){timer.run()}, newInterval);
}
}
var t = new Timer(function() {
var d = new Date();
document.getElementById('msg').innerHTML = d + ' : ' + d.getMilliseconds();
}, 1000);
window.onload = function() {
t.run();
};
</script>
<span id="msg"></span>
const myFunction = () => {
setTimeout(() => {
document.getElementById('demo').innerHTML = Date();
myFunction();
}, 10000);
}