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

标签 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 条记录,在主网格的 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");
                    }
                }
            }
        }
    });
}

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

对于 n^2 次循环。我不太懂优化,请多多指教算法大佬。

关于javascript - 如何优化长时间运行的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47083613/

相关文章:

arrays - swift :changing the content of an array gives me an error

flash - 如何使用 AIR 将图像写入应用程序目录?

javascript - 无法以编程方式检查 Kendo 网格的多选复选框过滤器

jquery - 如何使最后两项在底部对齐?

javascript - 查找 Iron Router 中定义的所有路由

javascript - 我怎样才能使用javascript来点击这些元素?

javascript - 如何从 jqgrid 和 Laravel 上传多个文件?

javascript - 这些回调如何适应配置对象?

javascript - 用户输入数字上的金额,然后输出最大的数字javascript

javascript - 我可以在 Kendo UI 径向仪表下方添加标签吗?