我在下面有以下代码(注意,我稍后会在循环中添加更多代码,但我需要首先使用它):
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');
}
我已确认'duration'条件正在执行,并且正在设置超时句柄。但是,这个循环永远不会结束,我从来没有看到setTimeout回调被执行。当我完全删除循环时,它工作正常(因为这使它成为函数中唯一的代码)。
任何帮助将不胜感激。 setTimeout不知何故超出范围?循环如何使超时脱轨?
答案 0 :(得分:7)
JavaScript是单线程的。只要代码卡在循环中,超时就永远不会运行。
任何依赖于超时完成的事情都应该在超时时间内。
答案 1 :(得分:5)
来自Event-Based Programming: What Async Has Over Sync
有趣的是,在剩下的所有剩余时间之前,超时不会执行 块中的代码已执行。因此,如果设置了超时,然后是一些 长时间运行的函数执行,超时甚至不会开始直到 长时间运行的功能已经完成。实际上,异步功能 像setTimeout和setInterval一样被推送到一个称为的队列 事件循环
因此,由于你之后有一个无限循环,你的setTimeout
永远不会被执行。