2

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

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

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

请帮忙!谢谢!

4

5 回答 5

2

让你绊倒的不是超时,而是无限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
}
于 2015-04-20T01:57:19.933 回答
1

setTimeout方法不像睡眠语句那样起作用。无论您在方法中设置什么时间间隔,您的while循环都将继续不断迭代setTimeout

您应该删除while并简单地使用setInterval(). (在 yibuysheng的回答中提到。+1)

var myInterval = setInterval(function () {
    console.log("%%--Hi--%%");
}, 5000);

如果要停止间隔,请运行以下命令:

clearInterval(myInterval);
于 2015-04-20T01:58:28.287 回答
1

试试这个代码:

logFun();

function logFun() {
    console.log("%%--Hi--%%");
    setTimeout(logFun, 5000);
}

或者,您可以尝试setInterval

setInterval(function () {
    console.log("%%--Hi--%%");
}, 5000);
于 2015-04-20T01:46:40.277 回答
0

您的问题是 setTimeout 是一个异步函数,因此您的代码在再次循环之前不会等待它完成。要解决这个问题,您必须在前一个计时器中创建新计时器。

同样,您必须从计时器内部调用要执行的任何操作,并且不能只在 while 循环中调用它们,因为它们不会等待计时器完成。

function logFun() {
    console.log("%%--Hi--%%");
    // execute actions
    setTimeout(logFun, 5000);
}

这就是易卜生对他刚刚出现的答案所做的事情。(仍然发布,因为没有解释答案。)

于 2015-04-20T01:54:45.733 回答
0

或者,如果您必须从 while 循环创建 setTimeout(),您可以使用布尔值 (true/false) 锁定它。这不像 yibuysheng 的回答那么干净,但它也允许您添加尽可能多的逻辑来控制启用和禁用超时。

例子:

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;
   }
}

另外,我怀疑无限 while 循环是否最适合您的上游代码。可能有一个可以挂钩的回调,例如 requestAnimationFrame 或一些相关事件。

于 2015-04-20T02:11:13.207 回答