计时器到期后重置setTimeout

时间:2015-04-20 01:40:49

标签: javascript timer settimeout cleartimeout

我有一个正在进行的while循环。在while循环中,有一个setTimeout()。我想在计时器到期后重置计时器。换句话说,当计时器到期时,它应该执行一些指定的操作,然后再次重新启动计时器。

例如,在以下代码中,%%--Hi--%%应仅在5秒内打印一次。但是,5秒后,连续打印%%--Hi--%%。我试过clearTimeout,但看起来clearTimeout只能在计时器到期之前停止计时器。

while(){
    var timeoutHandle = setTimeout(function() {
                        console.log("%%--Hi--%%");
                        clearTimeout(timeoutHandle);
                        }, 
                        5000); //5 sec
}

请帮忙!谢谢!

5 个答案:

答案 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或一些相关的事件。