我以前在内部应用程序中处理过这个问题,他们不关心浏览器需要多长时间才能关闭数据,他们只是不想点击提示。
的关键是向下打破工作成工作的相对可预测的块(预测的在CPU时间而言)和在类似的setInterval运行它们:
function doWork(begin, end) {
// Some chunk of what your worker function normally does from begin to end
if (actualEnd < end) // Nothing left to do
clearInterval(Interval);
}
var Interval = setInterval(doWork, 15);
这防止了IE提示出现(或Chrome提供“冻结”对话框)。下一步是添加一些代码,让用户完全跳过它;如果一开始就知道工作量,马上询问他们。如果没有,开始处理,并在n个块后问他们是否想要做更便宜的功能。
有2个着手完成这么多的工作,其他的选项:
- 向前看,以有多少工作要做,如果这是一个很大,它传递到服务器(这不幸的是手段再次在服务器上编写JS;当然,您可以使用运行Javascript的服务器引擎来节省自己的一些编码)。
- 从谷歌齿轮/ HTML5
使用背景工人
最后,如果你正在做的按需这么多的工作,也有在工作中你可能执行的速度向上的机会 - 该数据可以事先建立索引在服务器上使计算更快更简单,就像那样。但我不知道你在计算什么。
你可以有一个单独的函数,定期检查工作是否实际上正在继续 – JohnP 2011-04-18 09:02:00
在标准的JS你实际上不能;工作是以单线程的方式同步执行的,因此单独的函数在第一个完成之后才会运行,这就太迟了。 – 2011-04-19 00:39:31