在JavaScript中监视长期任务
-
16-09-2019 - |
题
我有一个特定的页面,该页面使用了许多必须由JavaScript例程初始化的小部件(大约400个,这是一个复杂的小部件)。这需要一些时间(甚至在较慢的机器上甚至20秒钟)。现在,我认为我可以显示一个进度指标(一个带有百分比标签的简单文本字段),而不是页面,但是我发现,即使我继续对其进行更新,持续的任务也会阻止所有内容,而且我也没有更新。因此,一切都冻结了,直到沉重的JavaScript任务完成。我什至进行了以下实验,但也冻结了(Firefox说该脚本花费的时间太长了...):)
function a(){
for (var i = 0; i < 5000000000000000; i++){
abb = i;
}
}
var abb;
function c(){
var ef = document.getElementById("pip");
ef.innerHTML = abb;
}
function b(){
setInterval(c, 50);
setTimeout(a, 1000);
}
我唯一的解决方案是分解长时间的工作并更新标签。...但是我想知道是否还有另一个解决方案!上帝,JS需要尽快线... :)
有任何想法吗?
解决方案
我可以假设脚本是从Onload事件中执行的,以便用户在运行时不会坐在空白页面上?
如果是的,那么我建议将脚本分为单独的函数,创建这些功能的数组,通过该数组进行迭代并评估功能,并在每个N函数之后更新进度指标。
而且,如果这是一个面向公共的网站,请尝试最大程度地减少体验页面绝对必要的JavaScript数量。以及每个小部件需要的初始化量。用史密斯(Smith)解释:如果没有人等待看见它们,雅阁折叠的树木有什么好处?
其他提示
如果需要线程,则可以使用liveConnect并创建真正的Java线程(如果安全管理器允许)。
如果不,您可以使用C的Coroutines设计模式。
问候。
这起作用了,假设您必须致电B以启动它并具有ID =“ PIP”的DIV
<html>
<head>
<script type="text/javascript">
var i;
var state = 0;
function a(){
switch(state){
case 0:
i = 0;
case 1:
i++;
for (; i < 5000000000000000; i++){
abb = i;
if (i%1000 == 0){
setTimeout(a, 1);
state = 1;
return;
}
}
break;
}
}
var abb;
function c(){
var ef = document.getElementById("pip");
ef.innerHTML = abb;
}
function b(){
setInterval(c, 50);
setTimeout(a, 1000);
}
</script>
</head>
<body onload="javascript:b();">
<div id = "pip">test</div>
</body>
</html>
不隶属于 StackOverflow