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

标签 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 毫秒 内使用react、完成一些计算和渲染,以给用户以 60 fps 运行的印象。

所以这是问题:

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

2) 是否还有其他方法可以让一些“长时间运行的代码可被用户中断”? (也许是网络 worker ?)

最佳答案

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

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

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

关于javascript - 如何在运行长 javascript 代码时处理用户输入事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15284726/

相关文章:

javascript - 我应该如何修改 PHP 和 Javascript 文件,以便复选框是强制性的?

javascript - KonvaJS:从中心缩放图像

javascript - 在过滤器中注入(inject) HTML - angularJS

delphi - 派生的TClient数据集;定义始终运行的 OnAfterPost

javascript - 对 setTimeout 中的第一个参数感到困惑

javascript - 可以在 JavaScript 中替换 var 吗?

javascript setAttribute 'className' 在Load上起作用,但在Click上不起作用

c# - RadListView ItemCommand 未触发

jquery - 在事件中使用js代码重定向

javascript - 为什么使用 Promise.then 设置 CSS 属性实际上不会发生在 then block ?