繁重的JavaScript计算阻止

时间:2016-05-03 15:59:37

标签: javascript multithreading client-side ui-thread heavy-computation

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

一些要求:

  • 我无法使用webWorkers
  • 计算必须在客户端(我无法在服务器端进行AJAX调用)

我是一名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线程

1 个答案:

答案 0 :(得分:3)

Javascript是单线程的。除非你使用wb worker,否则你唯一的选择就是将计算分成几部分。执行一部分计算,然后使用setImmediatesetTimeout安排下一个要运行的部分。这将为UI提供执行时间并防止您找到阻止。