问题 javascript设置间隔作为单独的线程运行?


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

从我的研究来看,似乎setInterval应该在后台的一个单独的线程中运行,但我没有看到它。

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

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

12595
2017-11-22 01:49


起源



答案:


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

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

读完那篇文章后,你会得到你的 setInterval 排队等待在1000ms后运行但仅在当前代码完成后运行。但由于无限循环,它无法完成。


10
2017-11-22 01:51





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

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

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


4
2017-11-22 01:56



感谢网络工作者链接。我是否正确读取来自工作人员的消息必须等到无限循环结束(=不能解决OP的问题)? - John Dvorak


答案:


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

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

读完那篇文章后,你会得到你的 setInterval 排队等待在1000ms后运行但仅在当前代码完成后运行。但由于无限循环,它无法完成。


10
2017-11-22 01:51





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

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

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


4
2017-11-22 01:56



感谢网络工作者链接。我是否正确读取来自工作人员的消息必须等到无限循环结束(=不能解决OP的问题)? - John Dvorak


正如已经说过的那样 - 回调 setInterval 在无限循环结束之前不会运行。要做你想要实现的目标 - 不使用网络工作者 - 你必须从循环本身检查时间:

var start = Date.now();
while((Date.now() - start) < 5000){
  ...
}

2
2017-11-22 01:58