TheMonarch
TheMonarch

Reputation: 617

setTimeout(callback) followed by while loop never fires

I have the following code below (note, I'll be adding more code into the loop later, but I need this to work first):

var calls_on = true;
function hunt(max, ext, duration){
    if(duration != '0' || duration != false || duration != 0){
        duration = duration * 1000; // milliseconds to delay before stopping calls
        var t=setTimeout(function(){calls_on=false;}, duration);
    }
    while(calls_on){
        alert('reached');
    }
    alert('test');
}

I have confirmed that the 'duration' conditional is executing, and the timeout handle is being set. However, this loop never ends, and I never see the setTimeout callback getting executed. When I remove the loop entirely, it works fine (since that makes it the only code in the function).

Any help would be appreciated. Is setTimeout somehow out of scope? How is the loop derailing the timeout?

Upvotes: 1

Views: 669

Answers (2)

Thomas Jones
Thomas Jones

Reputation: 4962

From Event-Based Programming: What Async Has Over Sync

Interestingly, a timeout will not execute until all of the remaining code in a block has executed. So if a timeout is set, and then some long running function executes, the timeout will not even start until that long running function has finished. In actuality, async functions like setTimeout and setInterval are pushed onto an queue known as the Event Loop

So, since you have an infinite loop after it, your setTimeout is never executed.

Upvotes: 5

Niet the Dark Absol
Niet the Dark Absol

Reputation: 324620

JavaScript is single-threaded. As long as the code is stuck in the loop, the timeout will never run.

Anything that relies on the timeout being completed should be inside the timeout.

Upvotes: 7

Related Questions