setTimeout在无限循环内无效

时间:2016-01-14 06:28:48

标签: javascript html html5

    while(true){
        window.setTimeout(function() {
            myMethod()
        }, 15000);
        }
        function myMethod() {
            alert("repeat");
        }

编写上面的代码片段是为了无限地执行mymethod但是在某些时间间隔但是一旦我运行代码我的浏览器挂起并且重复弹出窗口不断生成但是这里的时间是15秒。我想避免使用setInterval,所以为了我的目的使用这种技术。

5 个答案:

答案 0 :(得分:4)

Javascript是单线程的(Web工作者除外,但这与此示例无关,因此我们将忽略它)。这意味着setTimeout实际上是在至少一段时间之后安排一些代码在将来的某个时间执行,但只有当浏览器停止了当时在渲染线程上做的任何其他操作时,可能是渲染HTML,或执行JavaScript。

因此,setTimeout中的代码无法执行,直到while循环(以及任何代码包含它)完成并将控制权返回给浏览器。但它是一个无限循环,因此控制永远不会返回到浏览器,并且setTimeout中的代码永远不会被执行。

实际上,javascript中的一个常见习惯是使用超时为0(或可能为1)的setTimeout,以便在执行当前事件的代码之后尽快执行某些代码,通常在执行之后浏览器已呈现由javascript进行的任何html更改。

我不知道你的具体用例是什么,但是你可以使用setInterval(类似于setTimeout但是每隔一段时间重复调用)或者通过在函数内部调用setTimeout来做你想要的事情。 setTimeout用递归实现无限循环,但允许浏览器在迭代之间执行其他任务。

答案 1 :(得分:0)

  

但是一旦我运行代码,我的浏览器就会挂起

它会因为你在执行setTimeout()

的下一次迭代之前不会等待15 secs而无休止地创建while个请求。

如果你想每15秒保持一次警报,那么试试

window.setTimeout( myMethod, 15000);
function myMethod() 
{
    alert("repeat");
    window.setTimeout( myMethod, 15000);
}

答案 2 :(得分:0)

setTimeout是异步执行的。所以在你的代码中,无限循环创建了一个无限的setTimeouts,每个都有15秒的延迟。

答案 3 :(得分:0)

我认为,这里的诀窍是检查里面的 setTimeout并在满足条件时使用clearTimeout。这是一个示例,每隔1.5秒将计数记录到控制台,直到0。

function looper(time) {
  if (time > 0) {
    console.log(time);
    var timer = setTimeout(looper, 1500, --time);
  } else {
    clearTimeout(timer);
  }
}

looper(10);

您显然会将条件更改为程序所需的条件。

DEMO

答案 4 :(得分:0)

使用async / await,如果您想运行一个每3秒运行一次的函数的无限循环,则可以执行以下操作:

const wait = ms => new Promise(resolve => setTimeout(resolve, ms));

(async (delay) => {
  while (true) {
      await wait(delay);
      myFunc();
  }
}(3000); // 3 seconds