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

时间:2017-11-02 19:55:19

标签: javascript arrays kendo-ui

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

这导致长时间运行的脚本错误并且需要永久。并锁定浏览器。我的问题是;有没有办法可以优化我的迭代发生在另一个线程或后台。或者有更快的方式我可以更新记录。

//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");
                    }
                }
            });
        }
    }

}

这循环遍历10个分区,然后遍历10个记录,在maingrid中的400个记录的整个列表中查找记录。因此,您可以想象在用户再次获得控制权之前需要多长时间。

1 个答案:

答案 0 :(得分:1)

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

//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");
                    }
                }
            }
        }
    });
}

这样你的mainGrid将被缓存,你不会多次查询它,也不会搜索它的数据,如果没有选择行,你也不会运行昂贵的n ^ 2循环。 这是一个工作演示(简化): https://plnkr.co/edit/n3ZHmlqtoKZP4UQikw2A?p=preview

对于n ^ 2个循环。我不太了解优化它,请求更多的算法大师。