codingsplash
codingsplash

Reputation: 5045

Cancel an infinite loop in JavaScript

I am trying to timeout a function in case it has an infinite loop. But the below does not work. Any idea why and how to fix it?

setTimeout(clearValues,1000);

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

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

infin();

In the below case, I get the alert displayed ( a bit later than expected ) and the console statements continue printing even after the alert. That means setTimeout did not wait for the loop to end in this case. Any explanation for this?

setTimeout(clearValues,500);

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


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

infin();

Upvotes: 3

Views: 860

Answers (3)

Nina Scholz
Nina Scholz

Reputation: 386540

It works, when you made the infin call with a slightly different change.

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>

Upvotes: 0

u.k
u.k

Reputation: 3091

setTimeout works asynchronously, means it will run after 1000ms and the previous event loop is completed. Since the while loop will never be completed, the callback will never be called.

Add a condition to the loop if you want to exit it.

Upvotes: 3

Jean F.
Jean F.

Reputation: 1785

Another solution might be to use interval:

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

When you don't need it anymore:

clearInterval(clock);

Upvotes: 1

Related Questions