我有一个正在进行的while循环。在while循环中,有一个setTimeout()
。我想在计时器到期后重置计时器。换句话说,当计时器到期时,它应该执行一些指定的操作,然后再次重新启动计时器。
例如,在以下代码中,%%--Hi--%%
应仅在5秒内打印一次。但是,5秒后,连续打印%%--Hi--%%
。我试过clearTimeout
,但看起来clearTimeout只能在计时器到期之前停止计时器。
while(){
var timeoutHandle = setTimeout(function() {
console.log("%%--Hi--%%");
clearTimeout(timeoutHandle);
},
5000); //5 sec
}
请帮忙!谢谢!
答案 0 :(得分:1)
试试这段代码:
logFun();
function logFun() {
console.log("%%--Hi--%%");
setTimeout(logFun, 5000);
}
或者,您可以尝试setInterval
:
setInterval(function () {
console.log("%%--Hi--%%");
}, 5000);
答案 1 :(得分:1)
这不是绊倒你的超时,而是无限while
循环。您每秒都可以有效地创建数千个超时。将超时移到无限循环之外可以解决您的问题。
function timedAction() {
// your timed actions to be invoked every 5 seconds
setTimeout(timedAction, 5000); // start the next timeout
}
setTimeout(timedAction, 5000); // start the first timeout
while() {
// your continuously executing actions
}
过期后无需清除超时。
或者您也可以使用setInterval
,简化代码,如下所示:
function timedAction() {
// your timed actions to be invoked every 5 seconds
}
setInterval(timedAction, 5000); // start the interval
while() {
// your continuously executing actions
}
答案 2 :(得分:1)
setTimeout
方法不像睡眠语句。无论您在while
方法中设置的时间间隔如何,setTimeout
循环都会继续迭代。
您应该删除while
,然后只使用setInterval()
。 (在yibuyisheng's answer中提及。+ 1)
var myInterval = setInterval(function () {
console.log("%%--Hi--%%");
}, 5000);
如果要停止间隔,请运行以下命令:
clearInterval(myInterval);
答案 3 :(得分:0)
您的问题是setTimeout是一个异步函数,因此您的代码不会等到它再次循环之前完成。要解决此问题,您必须在上一个计时器内创建新计时器。
同样,你必须在定时器内调用你想要执行的任何动作,而不能只是在while循环中调用它们,因为它们不会等待定时器完成。
function logFun() {
console.log("%%--Hi--%%");
// execute actions
setTimeout(logFun, 5000);
}
这就是一不一生所做的回答刚才出现的问题。 (仍然发布,因为没有解释答案。)
答案 4 :(得分:0)
或者,如果必须从while循环创建setTimeout(),则可以使用布尔值(true / false)锁定它。这不像yibuyisheng的答案那么干净,但它也允许你添加尽可能多的逻辑,以控制启用和禁用超时。
示例:
window.isTimeoutLocked = false;
while(true) {
if (!window.isTimeoutLocked) {
var myFunction = function () {
console.log("%%--Hi--%%");
//The timeout has fired. Unlock it for the next one.
window.isTimeoutLocked = false;
}
window.setTimeout(myFunction, 5000);
//Timeout is queued. Lock this code until the timeout fires.
window.isTimeoutLocked = true;
}
}
另外,我怀疑无限循环最适合您的上游代码。可能有一个可以挂钩的回调,比如requestAnimationFrame或一些相关的事件。