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

时间:2013-02-19 21:08:48

标签: 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');
}

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

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

来自Event-Based Programming: What Async Has Over Sync

  

有趣的是,在剩下的所有剩余时间之前,超时不会执行   块中的代码已执行。因此,如果设置了超时,然后是一些   长时间运行的函数执行,超时甚至不会开始直到   长时间运行的功能已经完成。实际上,异步功能   像setTimeout和setInterval一样被推送到一个称为的队列   事件循环

因此,由于你之后有一个无限循环,你的setTimeout永远不会被执行。