我正在编写一个 CPU 密集型 javascript 应用程序。我遇到了一个问题,有时在 CPU 密集型计算发生时 UI 被锁定。我知道解决这个问题的标准方法是调用setTimeout
并让事件循环响应 UI 事件。但是,这对我不起作用,这就是原因。
当页面加载时,javascript vm 需要对数据块进行大量解析和分析。这是真正的背景资料,我正在调用setTimeout
运行每个块。但是,这意味着用户在完成所有块(对于大文件可能长达 10 秒)和每次保存之前都会获得非常不稳定的 UI 体验。这是不可接受的。
我能想到 2 个解决方案,但我都不喜欢:
- 对块更细化,从而为事件循环提供更多运行机会。但是,我不喜欢这样,因为 cpu 代码已经相当复杂,但它通常运行良好。在整个 cpu 绑定代码中调用
setTimeout
会使它变得更加复杂 - 在服务器上做更多的工作。但是,我正在运行节点服务器,这只会将问题从客户端推送到服务器,并增加带宽增加的问题。
在传统的基于线程的 VM 上解决此问题将是微不足道的。我应该为 Javascript 做什么?
更新:
有几点我忘了说:
- 我们不关心旧版浏览器,所有用户都需要使用现代的 Firefox、Chrome、Opera、Safari、IE 等。
- 我们最初的原型将客户端和服务器放在一起,但应该没有什么可以阻止我们迁移到远程服务器。
- 数据存在于客户端(嗯......显然,如果客户端和服务器是同一台机器,但即使我们移动到远程服务器也是如此)。
Webworkers 可能是解决方案,但它们看起来仍然不稳定。有没有人有他们的经验?它们稳定吗?哪些现代浏览器不能很好地支持它们?他们有什么普遍的问题吗?