如何在运行长javascript代码时处理用户输入事件?

如何在运行长javascript代码时处理用户输入事件?,javascript,events,settimeout,delay,setinterval,Javascript,Events,Settimeout,Delay,Setinterval,我有一个长时间运行的javascript代码,可以处理某种渲染(webgl)。 这是一种“自适应渲染”,在这种渲染中,我随着时间的推移越来越精确地计算曲面(这意味着场景的“分辨率”变得越来越精确) 我希望它运行,只要用户不按下键或移动鼠标。 如上所述,我可以使用setTimeout或setInterval,给javascript一些时间来处理其他事件 我在这方面测试了setTimeout和setInterval延迟,并观察到以下结果: setTimeout delay: 15-20 ms set

我有一个长时间运行的javascript代码,可以处理某种渲染(webgl)。 这是一种“自适应渲染”,在这种渲染中,我随着时间的推移越来越精确地计算曲面(这意味着场景的“分辨率”变得越来越精确)

我希望它运行,只要用户不按下键或移动鼠标。 如上所述,我可以使用setTimeout或setInterval,给javascript一些时间来处理其他事件

我在这方面测试了setTimeout和setInterval延迟,并观察到以下结果:

setTimeout delay: 15-20 ms
setInterval delay: 2-4 ms
它很快,但在我的情况下仍然很难使用。我需要能够做出反应,完成一些计算,并在16 ms中进行渲染,给用户以60 fps运行的印象

所以问题是:

1) 是否有其他(更聪明的)方法来检查是否有一些传入的用户输入事件需要处理


2) 我是否可以使用其他方法使某些“长时间运行的代码可被用户中断”?(可能是网络工作者?

您必须将代码分成小块,并按计时器的节拍运行每一块。在每个计时器刻度之间,可以处理用户事件,如果希望停止长时间运行的计时器驱动进程的执行,可以设置一个标志

没有其他方法来处理事件或检查挂起的事件。您必须返回到主事件循环,这意味着您的javascript执行线程需要完成。然后,在返回到事件循环之后,您可以执行更多代码的唯一方法是响应事件或使用计时器。这就是javascript的编写和架构方式


您唯一的其他选择是使用web workers,但它们不能接触DOM,不能在较旧的浏览器中工作,只能通过消息传递与主事件循环通信。很适合做计算,但不适合做动画。

网络工作者肯定可以在这里帮助你,当然他们只在最新的浏览器上工作……我也在想类似的事情……是否可以使用
while(true)
循环来检查每次迭代的当前时间,查看指定的时间是否已过?@MattB.-您可以定期检查长时间运行的代码中经过的时间,如果需要,可以每隔500ms左右停止处理,为下一次迭代设置计时器,然后返回事件循环。这将有助于控制每段代码运行的时间长度(无论计算机的速度如何),但显然,您仍必须完成执行以允许处理任何挂起的事件,然后在计时器上继续执行。因此,如果我理解正确,我将被迫使用setTimeout或setInterval来管理这些“计时器计时信号”?在这种情况下,我能确定事件会被处理吗?@Seb37-是的,如果您不能从web workers(javascript仅有的真正线程)完成工作,您必须使用计时器来允许事件处理(您必须从执行线程返回以允许事件处理)。据我所知,事件是按FIFO顺序处理的,因此在计时器事件之前发生的所有事件都会在下一个计时器滴答声之前得到处理。如果处理事件需要很多时间,这有时会延迟计时器回调。好吧,这很公平。我对这个解决方案不是很满意,但正如您所指出的,它似乎只是javascript的架构方式。我认为在我的情况下,最好的解决方案是计算,直到我发现渲染“可接受”,然后使用计时器块平滑处理其余部分。谢谢你,J00。