1

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

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

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

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

4

2 回答 2

7

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

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

于 2013-02-19T21:11:34.027 回答
5

来自基于事件的编程:异步有什么超过同步

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

因此,由于您有一个无限循环,因此您setTimeout永远不会执行。

于 2013-02-19T21:14:55.010 回答