setTimeout(回调)后跟while循环从不触发

The*_*rch 1 javascript callback settimeout

我在下面有以下代码(注意,我稍后会在循环中添加更多代码,但我需要首先使用它):

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');
}
Run Code Online (Sandbox Code Playgroud)

我已经确认'duration'条件正在执行,并且正在设置超时句柄.但是,这个循环永远不会结束,我从来没有看到setTimeout回调被执行.当我完全删除循环时,它工作正常(因为这使它成为函数中唯一的代码).

任何帮助,将不胜感激.setTimeout不知何故超出范围?循环如何使超时脱轨?

Nie*_*sol 7

JavaScript是单线程的.只要代码卡在循环中,超时就永远不会运行.

依赖于完成超时的任何事情都应该在超时内.


Tho*_*nes 5

基于事件的编程:异步有什么过度同步

有趣的是,在块中的所有剩余代码执行之前,超时不会执行.因此,如果设置了超时,然后执行了一些长时间运行的函数,则在该长时间运行的函数完成之前,甚至不会启动超时.实际上,setTimeout和setInterval等异步函数被推送到称为事件循环的队列中

所以,由于你之后有一个无限循环,你setTimeout永远不会被执行.