作为一个教育项目,我正在用JavaScript编写(又一个)编辑器风格的实时语法高亮工具。
为了保持编辑器的响应性,我显然选择了让荧光笔异步运行,然而,对于我正在使用的模型,如果在当前荧光笔完成之前输入了某些内容,我需要能够在启动另一个高亮笔之前终止另一个高亮笔,并且知道它在新的高亮笔开始之前被终止。
我正在考虑做一些类似以下的事情:
var terminate = false;
var terminated = false;
function work() {
while(!terminate)
console.log('working');
terminated = true;
}
function stop() {
terminate = true;
while(!terminated);
console.log('stopped');
}
setTimeout(work, 0);
setTimeout(stop, 10);然而,这个示例不起作用,我也尝试使用更多的setTimeouts来代替繁忙的等待,但也没有用。
有没有办法在JavaScript中实现这样的系统,或者我应该使用某种替代方案(或两者兼而有之)?
发布于 2011-09-08 02:32:36
如果您可以在没有DOM访问的情况下完成大部分工作,那么这将是web工作者的完美选择。
要修复您的示例,请尝试在0中使用setTimeout进行控制。这是可行的:
var terminate = false;
var terminated = false;
function work() {
if(!terminate) {
console.log('working');
setTimeout(work, 0);
}
else terminated = true;
}
function stop() {
terminate = true;
if(!terminated) {
setTimeout(stop,0);
}
else console.log('stopped');
}
setTimeout(work, 0);
setTimeout(stop, 100);编辑
用你的原始代码片段来解释这个问题: Javascript是单线程的(除非你使用的是web worker)。您可以使用事件、回调和setTimeout来实现并发的假象,但您真正要做的是告诉运行时在将来某个时间在单个执行线程上执行回调函数。在您的例子中,stop从未被执行过。在10毫秒到期后,计划运行“下一步”(即,在work完成后。由于work从未完成,因此stop永远无法运行。
因此,您希望从javascript中获得的任何明显的并发性都将是协作的。你的工作线程将不得不暂停,并显式地允许“其他东西”发生,以保持幻觉。
发布于 2011-09-08 02:34:27
在这种情况下,可以考虑使用Workers。大多数现代浏览器都支持它们。没有工作者,javascript就没有真正的并发性(这很好)-所有的工作都在一个线程中完成。
大量的setTimeout()调用是致命的。
https://stackoverflow.com/questions/7338684
复制相似问题