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

时间:2013-03-08 00:41:42

标签: javascript events settimeout delay setinterval

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

只要用户没有按任何键或移动鼠标,我希望它能够运行。 如上所述here,我可以使用setTimeout或setInterval来为javascript提供一些时间来处理其他事件。

我已在此jsFiddle上测试了setTimeout和setInterval延迟,我观察到以下结果:

setTimeout delay: 15-20 ms
setInterval delay: 2-4 ms

它很快,但在我的情况下仍然很难使用。我需要能够做出反应,完成一些计算并在 16 ms 中呈现,以给用户留下以 60 fps 运行的印象。

所以这是问题:

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

2)是否还有其他东西可以用来制作一些“用户可以中断长时间运行的代码”? (也许是网络工作者?)

1 个答案:

答案 0 :(得分:2)

你必须将你的代码分解成小块并在计时器刻度上运行每个块。在每个计时器滴答之间,可以处理用户事件,如果希望执行长时间运行的计时器驱动过程,则可以设置标志。

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

你唯一的另一个选择是使用网络工作者,但他们不能触摸DOM,不能在旧浏览器中工作,只能通过消息传递与主事件循环通信。适合做计算,但不适合做动画。