【问题标题】:How to optimize ajax response in jquery?如何在 jquery 中优化 ajax 响应?
【发布时间】:2021-01-28 08:25:23
【问题描述】:

我正在从数据库中获取大约 5000 行数据以及 5 个关系表数据。这导致了这个问题。我在网络选项卡中看到请求资源的大小是 9.1 mb 。之后我在这样的表中附加数据

$.ajax({
            type: "POST",
            url: url,
            data: form.serialize(), // serializes the form's elements.
            success: function(data) {


                if (data.status == "success") {
                    var consignment = data.consignment;

                    for (var i = 0; i <= consignment.length; i++) {
                        if (typeof consignment[i] !== "undefined") {

                            if (consignment[i].run_sheets != null) {
                                var run_sheet_name = consignment[i].run_sheets.name;
                                var run_sheet_id = consignment[i].run_sheets.id;
                                if (consignment[i].run_sheets.drivers != null) {
                                    var driver = consignment[i].run_sheets.drivers.name;

                                } else {
                                    var driver = '';
                                }
                                if (consignment[i].run_sheets.vehicles != null) {
                                    var vehicle = consignment[i].run_sheets.vehicles.name;
                                } else {
                                    var vehicle = '';
                                }
                            } else {
                                var run_sheet_name = '';
                                var run_sheet_id = '';
                                var driver = '';
                                var vehicle = '';
                            }


                            if (consignment[i].delivery_runs !== null) {
                                var delivery_run_name = consignment[i].delivery_runs.name;
                            } else {
                                var delivery_run_name = '';
                            }
                            if (consignment[i].delivery_addresses != null) {
                                var delivery_name = consignment[i].delivery_addresses.company_name;
                                var delivery_suburb = consignment[i].delivery_addresses.suburb;
                                var delivery_postcode = consignment[i].delivery_addresses.postcode;
                            } else {
                                var delivery_name = '';
                                var delivery_suburb = '';
                                var delivery_postcode = '';
                            }
                            if (consignment[i].customers != null) {
                                var customer_name = consignment[i].customers.name;

                            } else {
                                var customer_name = '';
                            }

                            if (consignment[i].product_types != null || consignment[i].product_types != undefined) {
                                var product_type = consignment[i].product_types.name;

                            } else {

                                var product_type = null;
                            }
                            $('#consignment_table > tbody').append(

                                `<tr class="consignment-row" id="${consignment[i].id}"><td><label class="kt-checkbox kt-checkbox--single kt-checkbox--solid">
                                    <input  type="checkbox"  class="kt-checkable check_con" name="check_consignment" data-id="${consignment.id}"  value="${consignment[i].id}">
                                    <span></span>
                                    </label></td><td>${consignment[i].id}</td><td>${$.trim(customer_name)}</td><td>${consignment[i].customer_reference}</td><td>${$.trim(delivery_name)}</td><td>${$.trim(delivery_suburb)}</td><td>${$.trim(delivery_postcode)}</td><td class="carton">${consignment[i].carton}</td><td>${consignment[i].pallet}</td><td>${consignment[i].space}</td><td>${consignment[i].weight}</td><td>${$.trim(run_sheet_name)}</td><td>${run_sheet_id}</td><td>${getStatusName(consignment[i].status)}</td><td>${$.trim(delivery_run_name)}</td><td>${$.trim(getFormattedDate(consignment[i].delivery_date))}</td><td>${$.trim(getFormattedDate(consignment[i].required_delivery_date))}</td><td>${driver}</td><td>${vehicle}</td><td>${consignment[i].consignment_type}</td><td>${$.trim(product_type)}</td><td><a href="/consignments/show/${consignment[i].id}"><i class="fa fa-eye"></i></a></td></tr>`

                            );
                        }
                    }
                } else {

                    toastr.error(data.message);
                }

                $('#consignment_table').DataTable({
                    "deferRender": true,
                    responsive: true,
                    "order": [],
                    "bSort": true,
                    scrollY: '50vh',
                    scrollX: true,
                    scrollCollapse: true,
                    "paging": false,
                    dom: '<"top"i>f<"top"rt><"clear">',

                    aLengthMenu: [
                        [-1],
                        ["All"]
                    ],
                    iDisplayLength: 5000
                }).draw();

                $('.loader').hide();

            }



        });

渲染大约需要 2 到 3 分钟。有时浏览器页面崩溃。有什么方法可以在不崩溃浏览器的情况下快速解决这个问题?

我不能使用分页。或任何类似的事情我只需要一次呈现数据

【问题讨论】:

  • 你真的应该考虑使用分页。获取传递一个查询参数,例如:?p=1&amp;r=50 含义:page: 1, results: 50 你最终会得到一个更小的查询和一个非常快速的页面渲染。如何实现分页系统——这取决于你。也许您使用的后端框架已经有一些开箱即用的工具?或者,您也可以使用延迟加载来代替分页 - 根据developer.mozilla.org/en-US/docs/Web/API/…,您可以从数据库中动态获取行
  • 您可以将繁重的负载传递给Web Worker,尽管 pagination 在这种情况下确实会有所帮助。另一种选择是发送多个较小的请求,直到完成。就像获得 500 行 10 次或 100 行 50 次一样。那么再次发送大量请求也有其弊端
  • 如果,由于任何邪恶的原因,您不能正确地执行此操作(即分页...),那么这里有一些选项: 1) 一次性渲染所有 HTML。添加var html = ""; 并将$('#consignment_table &gt; tbody').append( 更改为html+=,然后在for 之后添加$('#consignment_table &gt; tbody').append(html)。 2) 渲染 html 服务器端,它应该(通常)比在相对较慢的客户端/平板电脑上更快 3) 使用数据表的 ajax 方法直接加载数据,而不是从 html 转换(这不是最快的)(和数据表的ajax 加载还允许分页/过滤/等)
  • 您的浏览器必须多次存储相同的数据:1) ajax 数据加载 2) 转换为 html 3) 读入数据表对象 4) 将数据表对象转换为 html。浏览器不是为 OLAP/大型数据集设计的,所以它崩溃也就不足为奇了。人们无法一次看到 5000 条记录,因此以这种方式显示它毫无意义。为所有数据提供 csv/xlsx 导出。生成以可用方式提供数据的报告/图表。找到他们真正需要的东西。 (提示:“一次在屏幕上查看 5000 条记录”不是最终用途

标签: javascript jquery ajax xmlhttprequest


【解决方案1】:

其实这个问题不仅仅是因为大数据,主要问题是数据表响应属性。

当我现在评论响应式属性时,它工作得非常好

现在时间从2min减少到15sec

$('#consignment_table').DataTable({

                    // responsive: true,

                    scrollY: '50vh',
                    scrollX: true,
                    scrollCollapse: false,
                    "paging": false,

                    dom: '<"top"i>f<"top"rt><"clear">',

                    aLengthMenu: [
                        [-1],
                        ["All"]
                    ],
                    iDisplayLength: 5000
                }).draw();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 2013-08-05
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2019-09-23
    • 2021-02-09
    • 1970-01-01
    相关资源
    最近更新 更多