繁重的JavaScript计算块

繁重的JavaScript计算块,javascript,multithreading,client-side,ui-thread,heavy-computation,Javascript,Multithreading,Client Side,Ui Thread,Heavy Computation,我(在JavaScript/jQuery中)进行了大量计算。问题是,这些计算阻塞了UI线程,而我(尝试和)无法找到避免这种情况的方法 一些要求: 我不能使用网络工作者 计算必须在客户端进行(我不能在服务器端进行AJAX调用) 我是一名Android程序员,所以我知道如何在Java中做到这一点(启动线程、进行计算、将数据发送到UI线程),所以我在这里尝试做同样的事情 因此,这些繁重的计算只能有一个活动实例(我将制作一个GIF,建议用户在结束之前不能再次启动此实例),因此不需要管理多个调用(最后

我(在JavaScript/jQuery中)进行了大量计算。问题是,这些计算阻塞了UI线程,而我(尝试和)无法找到避免这种情况的方法

一些要求:

  • 我不能使用网络工作者
  • 计算必须在客户端进行(我不能在服务器端进行AJAX调用)
我是一名Android程序员,所以我知道如何在Java中做到这一点(启动线程、进行计算、将数据发送到UI线程),所以我在这里尝试做同样的事情

因此,这些繁重的计算只能有一个活动实例(我将制作一个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);
}
var数据=[];//这里有10000个数据
函数排序(参数、参数类型、顺序){
var newArray=JSON.parse(JSON.stringify(datas));
setTimeout(函数(){
var-end=false;
对于(var i=newArray.length-1;i>0&&!end;i--){
结束=真;
对于(var j=0;jnewArray[j][param]&&order.localeCompare(“down”)==0){
排序=真;
}
}else if(paramType.localeCompare(“nbr”)==0){
if((newArray[j+1][param]-newArray[j][param])<0&&order.localeCompare(“up”)==0){
排序=真;
}else如果((newArray[j+1][param]-newArray[j][param])>0&&order.localeCompare(“down”)==0){
排序=真;
}
}
如果(排序){
var tmp=newArray[j+1];
newArray[j+1]=newArray[j];
newArray[j]=tmp;
结束=假;
}
}
}
datas=newArray;
}, 0);
}
我正在对数据进行排序(为了避免手机从服务器重新加载数据,这就是为什么我不能在服务器端进行排序)

我尝试在函数中复制(完整复制,无引用)数组,因为我认为包含数据的初始变量(因为它不在函数中)在UI线程上,并且将其访问到函数中会调用UI线程=>不起作用。(所以我错了)

我尝试在一个
setTimout({computations},0)
中启动计算,正如您所看到的,这是一个解决方案,我在其他堆栈溢出上看到了很多时间,类似的问题=>也不起作用

我在一个基本的JavaScript环境中运行,我使用的唯一库是jQuery


那么,这里有没有一种方法可以强制这些计算在其他线程(或类似的线程)或更全局的线程中工作,不要阻止UI线程?

Javascript是单线程的。除非您使用wb worker,否则您唯一的选择是将计算拆分为多个部分。执行一段计算,然后使用
setImmediate
setTimeout
安排下一段运行。这将使UI有时间执行并防止您发现的阻塞。

Javascript是单线程的。除非您使用wb worker,否则您唯一的选择是将计算拆分为多个部分。执行一段计算,然后使用
setImmediate
setTimeout
安排下一段运行。这将给UI时间来执行和防止您发现的阻塞。

看一看,建议将后台工作分为多个部分,中间有一些部分用于UI更新。确切地说,为什么您不能使用Web Workers?@AkshatMahajan,因为它与所有设备/浏览器不兼容。看一看,建议将后台工作分为若干部分,中间有一些部分用于更新UI。确切地说,为什么不能使用Web Workers?@AkshatMahajan,因为它与所有设备/浏览器都不兼容。