13

我想使用计时器作为后备,以防我最终陷入无限循环。似乎设置间隔是执行此操作的正确方法。但是,它对我不起作用。

根据我的研究,似乎 setInterval 应该在后台的单独线程中运行,但我没有看到。

为什么会发生这种行为?我该如何解决这个问题?

var time = 0;
window.setInterval(function(){time++;}, 1000);
while (true) {
    //stuff done
    if (time >= 5) {
        break;
    }
}
4

3 回答 3

11

浏览器 javascript 在单个线程中运行。因此,如果您执行的操作时间过长 - 它会冻结浏览器。

有关详细信息,请参阅 John Resig 文章:http: //ejohn.org/blog/how-javascript-timers-work/

阅读那篇文章后,您会发现您的setInterval回调排队等待在 1000 毫秒后运行,但仅在当前代码完成后运行。但是由于无限循环,它无法完成。

于 2012-11-22T01:51:17.977 回答
4

zerkms有正确的答案。但我要补充一点,网络工作者是一种从客户端 javascript 获得一些多线程行为的方法。

var worker = new Worker('my_task.js');
worker.onmessage = function(event) {
 console.log("Called back by the worker!\n");
};

工作线程在后台线程中运行,您可以交换消息和订阅事件。这很漂亮。

于 2012-11-22T01:56:09.093 回答
2

正如已经说过的-setInterval直到无限循环完成,回调才会运行。要完成您想要实现的目标 - 不使用网络工作者 - 您必须检查循环本身的时间:

var start = Date.now();
while((Date.now() - start) < 5000){
  ...
}
于 2012-11-22T01:58:15.483 回答