我(在JavaScript / jQuery中)进行大量计算。问题是这些计算阻止了UI线程而我(尝试过)无法找到避免这种情况的方法。
一些要求:
我是一名Android程序员,因此我知道如何在Java中执行此操作(启动线程,进行计算,将数据发送到UI线程),所以我在这里尝试做同样的事情。 / p>
所以这些繁重的计算只能有一个活动实例(我会建一个GIF来告知用户他可以在此之前再次启动它)所以不需要管理多个呼叫(最后一个,开始新的。)
以下是代码:
var datas = []; // 10000 datas here
function sortBy(param, paramType, order) {
var newArray = JSON.parse(JSON.stringify(datas));
window.setTimeout(function(){
var end = false;
for (var i = newArray.length - 1; i > 0 && !end; i--) {
end = true;
for (var j = 0; j < i - 1; j++) {
var sort = false;
if (paramType.localeCompare("str") == 0) {
if (newArray[j + 1][param].localeCompare(newArray[j][param]) < 0 && order.localeCompare("up") == 0) {
sort = true;
} else if (newArray[j + 1][param] > newArray[j][param] && order.localeCompare("down") == 0) {
sort = true;
}
} else if (paramType.localeCompare("nbr") == 0) {
if ((newArray[j + 1][param] - newArray[j][param]) < 0 && order.localeCompare("up") == 0) {
sort = true;
} else if ((newArray[j + 1][param] - newArray[j][param]) > 0 && order.localeCompare("down") == 0) {
sort = true;
}
}
if (sort) {
var tmp = newArray[j + 1];
newArray[j + 1] = newArray[j];
newArray[j] = tmp;
end = false;
}
}
}
datas = newArray;
}, 0);
}
我正在排序数据(并且为了避免从服务器为移动设备重新加载数据,这就是为什么我无法在服务器端进行此操作)。
我试图在函数中复制(完整拷贝,没有引用)数组,因为我认为包含数据的初始变量,因为她不在函数中,是在UI线程上,并将其访问到函数中会调用UI线程。的 =&GT;不行。(所以我错了)。
我试图在setTimout( {computations}, 0)
中启动计算,如您所见,这是一个解决方案,我在其他Stack Overflow上看到了很多时间类似的问题=&gt; 也不起作用。
我在一个基本的JavaScript环境中运行,我使用的唯一库是jQuery。
那么,这是一种强制此计算在其他线程(或类似的东西)中工作的方法,还是更全局的,不阻止UI线程?
答案 0 :(得分:3)
Javascript是单线程的。除非你使用wb worker,否则你唯一的选择就是将计算分成几部分。执行一部分计算,然后使用setImmediate
或setTimeout
安排下一个要运行的部分。这将为UI提供执行时间并防止您找到阻止。