Javascript 如何优化长时间运行的脚本

Javascript 如何优化长时间运行的脚本,javascript,arrays,kendo-ui,Javascript,Arrays,Kendo Ui,在我的应用程序中,用户可以更新我剑道网格的多行。在这些信息保存到数据库中之后,我必须更新行。但我能做到这一点的唯一方法是迭代我的分区和网格的每一行来更新这些记录 这会导致长时间运行的脚本错误,并且会花费很长时间。并锁定浏览器。我的问题是,;是否有一种方法可以优化我的迭代,使其在另一个线程中或在后台发生。或者有没有更快的方法更新记录 //maingrid contains 400 records //10 partitions containing 10 rows changed by user

在我的应用程序中,用户可以更新我剑道网格的多行。在这些信息保存到数据库中之后,我必须更新行。但我能做到这一点的唯一方法是迭代我的分区和网格的每一行来更新这些记录

这会导致长时间运行的脚本错误,并且会花费很长时间。并锁定浏览器。我的问题是,;是否有一种方法可以优化我的迭代,使其在另一个线程中或在后台发生。或者有没有更快的方法更新记录

//maingrid contains 400 records
//10 partitions containing 10 rows changed by user
//100 records needing to be updated.

function updateAssignmentsInUI(partitions) {

    for (var i = 0; i < partitions.length; i++) {

        for (var j = 0; j < partitions[i].length; j++) {

            var mainGrid = $("#mainGrid").data("kendoGrid");
            $.each(mainGrid.dataSource.data(), function () {

                if (this.RowSelected === true) {

                    if (this.ID === partitions[i][j].ID) {
                        var row = mainGrid.dataSource.getByUid(this.uid);
                        row.set("Changed", "Yes");
                    }
                }
            });
        }
    }

}
//主网格包含400条记录
//10个分区,包含用户更改的10行
//100条需要更新的记录。
函数updateAssignmentsUI(分区){
对于(var i=0;i

它循环10个分区,然后循环10条记录,在主网格中的400条记录的整个列表中查找该记录。因此,您可以想象用户再次获得控制权需要多长时间。

您可以尝试更改/缓存查询。我不知道这会有多大帮助,但是试着像这样使用你的代码

//maingrid contains 400 records
//10 partitions containing 10 rows changed by user
//100 records needing to be updated.

function updateAssignmentsInUI(partitions) {
    var mainGrid = $("#mainGrid").data("kendoGrid");
    $.each(mainGrid.dataSource.data(), function () {
        if (this.RowSelected === true) {
            for (var i = 0; i < partitions.length; i++) {
                for (var j = 0; j < partitions[i].length; j++) {
                    if (this.ID === partitions[i][j].ID) {
                        var row = mainGrid.dataSource.getByUid(this.uid);
                        row.set("Changed", "Yes");
                    }
                }
            }
        }
    });
}
//主网格包含400条记录
//10个分区,包含用户更改的10行
//100条需要更新的记录。
函数updateAssignmentsUI(分区){
var mainGrid=$(“#mainGrid”).data(“kendoGrid”);
$.each(mainGrid.dataSource.data(),函数(){
if(this.RowSelected==true){
对于(var i=0;i
这样,您的主网格将被缓存,您将不会多次查询它,也不会搜索它的数据,如果未选择行,您也不会运行昂贵的n^2循环。 下面是一个工作演示(简化):


对于n^2循环。我不知道如何优化它,请它提供更多的算法专家。

使用@emed:仍然会冻结浏览器直到完成。谢谢!但我处理的数据如此之大,以至于我几乎看不到我这边有什么不同。上面的代码应该可以消除很多问题,但是您可以尝试在最后使用setTimeout进行异步操作。仍然需要相同的cpu,但是您可以让它们在队列中工作