setTimeout(callback) followed by while loop never fires

三世轮回 提交于 2019-12-18 09:22:27

问题


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?


回答1:


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.




回答2:


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.



来源:https://stackoverflow.com/questions/14967459/settimeoutcallback-followed-by-while-loop-never-fires

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!