我需要迭代一些大型数组并将它们存储在API调用的主干集合中.如果没有使循环导致界面无响应,最好的方法是什么?
由于返回的数据太大,ajax请求的返回也会阻塞.我认为我可以将其拆分并使用setTimeout使其以较小的块异步运行,但有更简单的方法来执行此操作.
我认为一个Web工作者会很好,但它需要改变UI线程上保存的一些数据结构.我已经尝试使用它来执行ajax调用,但是当它将数据返回到UI线程时,仍然有一段时间界面没有响应.
提前致谢
我有JavaScript执行大量的计算以及从DOM读取/写入值.该页面非常庞大,因此通常最终会锁定浏览器长达一分钟(有时更长时间使用IE),CPU占用率为100%.
是否有任何资源可以优化JavaScript以防止这种情况发生(我能找到的是如何关闭Firefox长时间运行的脚本警告)?
我有一个按钮,当它被点击时会运行一个长时间运行的功能.现在,当函数运行时,我想更改按钮文本,但我在Firefox,IE等浏览器中遇到问题.
HTML:
<button id="mybutt" class="buttonEnabled" onclick="longrunningfunction();"><span id="myspan">do some work</span></button>
Run Code Online (Sandbox Code Playgroud)
JavaScript的:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
document.getElementById("mybutt").disabled = true;
document.getElementById("mybutt").className = "buttonDisabled";
//long running task here
document.getElementById("myspan").innerHTML = "done";
}
Run Code Online (Sandbox Code Playgroud)
现在这在firefox和IE中都有问题,(在chrome中它可以正常工作)
所以我想把它放到一个settimeout:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
document.getElementById("mybutt").disabled = true;
document.getElementById("mybutt").className = "buttonDisabled";
setTimeout(function() {
//long running task here
document.getElementById("myspan").innerHTML = "done";
}, 0);
}
Run Code Online (Sandbox Code Playgroud)
但这对firefox也不起作用!按钮被禁用,更改颜色(由于新css的应用)但文本不会更改.
我必须将时间设置为50毫秒而不是仅仅0毫秒,以使其工作(更改按钮文本).现在我至少发现这个愚蠢.我可以理解它是否只能在0ms的延迟下工作,但在较慢的计算机中会发生什么?也许firefox在settimeout需要100ms?听起来很愚蠢.我尝试了很多次,1毫秒,10毫秒,20毫秒......不,它不会刷新它.只有50ms.
所以我遵循了这个主题的建议:
在javascript dom操作之后强制在Internet Explorer中进行DOM刷新
所以我试过了:
function longrunningfunction() {
document.getElementById("myspan").innerHTML = "doing some work";
var a = document.getElementById("mybutt").offsetTop; //force …Run Code Online (Sandbox Code Playgroud) 我的JS脚本中有这样的功能:
function heavyWork(){
for (i=0; i<300; i++){
doSomethingHeavy(i);
}
}
Run Code Online (Sandbox Code Playgroud)
也许"doSomethingHeavy"本身是好的,但它重复300次导致被卡住了不可忽略的时间浏览器窗口.在Chrome中,这不是一个大问题,因为只有一个Tab受到影响; 但对于Firefox来说,这是一场彻底的灾难
有没有办法告诉浏览器/ JS"放轻松",而不是阻止对doSomethingHeavy的调用之间的所有内容?
我有一个javascript循环,需要一些时间来处理.我希望我可以减少它,但它必须处理大量的数据.当它正在运行时,浏览器当然没有响应.我已经阅读了在javascript中处理此问题的最佳方法是使用某种异步循环.这样,鼠标点击等可以在循环处理之间继续处理.是否有适用于此的标准异步框架?或者有人可以提供一个如何编码的简单示例?谢谢!
I am using the innerHTML property to modify a DIV dynamically, to report on a process that takes a few seconds to finish. The problem is that on Firefox the page is not actually re-rendered to reflect that change until after the script has finished. This makes the app feel sluggish. Is there a way to make sure that changes to the HTML show up immediately, even if more scripts are running?
有没有一种在javascript中执行长时间运行操作的好方法?例如,我有一个可能需要2分钟才能运行的功能.我们如何打破像这样的大型行动?如果我使用的是java或C,我会在后台线程中执行此任务.有没有办法告诉浏览器暂停脚本的执行,以便它可以让它的前台/ UI线程再次工作?像这样的东西?:
function bigJob() {
for (i = 0; i < 1000000; i++) {
someWork();
sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
javascript ×7
dom ×2
ajax ×1
arrays ×1
asynchronous ×1
backbone.js ×1
css ×1
firefox ×1
html ×1
loops ×1
settimeout ×1