我试图每10秒重复一次setTimeout
。我知道setTimeout
默认只等待,然后执行一次动作。我该如何重复这个过程?
setTimeout(function() {
setTimeout(function() {
console.log("10 seconds");
}, 10000);
}, 10000);
答案 0 :(得分:69)
也许你应该使用setInterval()
答案 1 :(得分:39)
setInterval()
可能就是你要找的东西,但是如果你想要用setTimeout()
获得同样的效果:
function doSomething() {
console.log("10 seconds");
setTimeout(doSomething, 10000);
}
setTimeout(doSomething, 10000);
或者,如果您不想声明一个单独的函数并希望坚持使用函数表达式,则需要将其设为命名的函数表达式:
setTimeout(function doSomething() {
console.log("10 seconds");
setTimeout(doSomething, 10000);
}, 10000);
(如果您不介意使用已弃用的语言功能,请使用arguments.callee。)
答案 2 :(得分:18)
根据我的说法,setInterval()是你个案中最好的方法
这里有一些代码:
setInterval(function() {
//your code
}, 10000);
// you can change your delay by changing this value "10000".
答案 3 :(得分:15)
与@nnnnnn和@uzyn提供的答案不同,我不鼓励您使用setInterval
,原因如下answer所述。而是使用以下Delta Timing脚本:
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);
}
}
上述脚本尽可能靠近指定的render
运行给定的interval
函数,并回答您的问题,它使用setTimeout
重复一个过程。在您的情况下,您可以执行以下操作:
var timer = new DeltaTimer(function (time) {
console.log("10 seconds");
}, 10000);
var start = timer.start();
答案 4 :(得分:1)
这是一个使用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>
答案 5 :(得分:0)
使用jQuery,您可以这样做:
function updatePage() {
var interval = setTimeout(updatePage, 10000); // 10' Seconds
$('a[href]').click(function() {
$(this).data('clicked', true);
clearInterval(interval); // Clears Upon Clicking any href Link
console.log('Interval Cleared!');
});
// REPLACE 'YOUR_FUNCTION_NAME' function you would like to execute
setTimeout(YOUR_FUNCTION_NAME, 500);
} // Function updatePage close syntax
updatePage(); // call the function again.
答案 6 :(得分:0)
const myFunction = () => {
setTimeout(() => {
document.getElementById('demo').innerHTML = Date();
myFunction();
}, 10000);
}
最简单但不是有效的方法!