取消JavaScript中的无限循环

时间:2015-06-29 06:07:29

标签: javascript settimeout

我试图在函数有无限循环的情况下超时。但是下面的方法不起作用。知道为什么以及如何解决它?

setTimeout(clearValues,1000);

function clearValues(){
    i=0;
    alert("hi "+i);
}

i=19
function infin(){
    while(i>0){
        console.log(i);
        i++;
    }
    alert("Done");
}

infin();

在下面的例子中,我显示警报(比预期的晚一点),控制台语句甚至在警报后继续打印。这意味着在这种情况下,setTimeout不会等待循环结束。对此有何解释?

setTimeout(clearValues,500);

function clearValues(){
    alert("clear");
}


function infin(){
for(i=0;i<10000;){
    i=i+0.3;
    console.log(i);
}
}

infin();

3 个答案:

答案 0 :(得分:3)

setTimeout异步工作,意味着它将在1000ms 之后运行并完成上一个事件循环。由于while循环永远不会完成,因此永远不会调用回调。

如果要退出,请在循环中添加条件。

答案 1 :(得分:1)

另一种解决方案可能是使用间隔:

var code = function(){ 
              console.log('tick'); 
           };
var clock = setInterval(code, 200);

当你不再需要它时:

clearInterval(clock);

答案 2 :(得分:0)

当您使用略有不同的更改进行infin通话时,它可以正常工作。

var i = 0;
setTimeout(clearValues, 1000);
var interval = setInterval(infin, 0);

function clearValues() {
    out("clear");
    clearInterval(interval);
}

function infin() {
    if (i < 10000) {                    // if you be shure that you
        i++;
        out(i);
    } else {                            // never reach the limit,
         clearInterval(interval);       // you can remove the four
    }                                   // commented lines
}

function out(s, pre) {
    var descriptionNode = document.createElement('div');
    if (pre) {
        var preNode = document.createElement('pre');
        preNode.innerHTML = s + '<br>';
        descriptionNode.appendChild(preNode);
    } else {
        descriptionNode.innerHTML = s + '<br>';
    }
    document.getElementById('out').appendChild(descriptionNode);
}
<div id="out"></div>