繁体   English   中英

如何停止 DataTables 实例已启动的所有当前正在进行的 Ajax 查询?

[英]How can I stop all the currently ongoing Ajax queries that DataTables instance have started?

简要描述;简介

将测试服务器重置为已知状态会导致我的测试失败,因为 DataTables 实例启动的 Ajax 请求在服务器重置时正在进行。 我想通过在服务器重置之前停止 DataTables 请求来防止这种情况。

详细说明

我有一个在某些页面上使用 DataTables 的应用程序。 这些数据表都执行服务器端查询来填充它们的表。

当我执行系统测试时,有时会发生竞争情况:

  1. 测试运行程序启动测试服务器。

  2. 测试运行程序在测试浏览器中加载一个页面,其中某处有一个 DataTable 实例。

  3. 测试运行程序运行测试,该测试执行其检查并结束。

  4. 测试运行程序将测试服务器重置为已知状态以进行下一次测试。

  5. 页面上显示一条警报,指出 DataTables 遇到了 Ajax 错误。 警报说:

DataTables 警告:table id=[some id] - Ajax 错误。 有关此错误的更多信息,请参阅http://datatables.net/tn/7

  1. 我的测试系统不期待警报,即使测试实际上是成功的,它也会感到困惑并记录失败。 (或者在某些情况下,它会崩溃。)

我知道这是因为服务器突然中断了 Ajax 请求。 我正在寻找的是一种防止警报出现的方法。 我想在服务器重置之前停止所有正在进行的 DataTables 请求。

解决方案已被拒绝

  • 告诉 DataTables 实例不要使用警报:如果 DataTables 实例遇到与重置测试服务器无关的问题,我希望我的测试大声失败。

  • 修改测试服务器:我更喜欢让服务器保持简单,而不用担心可能无法响应的请求。

  • 等待客户端所有请求结束:这会大大减慢测试速度,尤其是当这种等待重复进行数十次测试时。

  • 将测试浏览器引导到一个新页面,上面没有 DataTables,因为这会中断当前请求:这又会损害测试性能。

解决方案

在测试完成所有检查后,让驱动浏览器的软件在浏览器中执行以下代码。 (这将在测试后运行某种“拆除”代码。)

if (typeof $ !== "undefined" && $.fn.dataTable) {
    var all_settings = $($.fn.dataTable.tables()).DataTable().settings();
    for (var i = 0, settings; (settings = all_settings[i]); ++i) {
        if (settings.jqXHR)
            settings.jqXHR.abort();
    }
}

解释

即使在未加载 jQuery 或未加载 DataTables 的页面上执行,代码也可以正常工作。 因此它首先检查它们是否已加载,如果未加载则不执行任何操作。 然后它获取所有 DataTable 实例的设置对象。 在每个设置对象中,它检查是否存在jqXHR ,当发出 Ajax 请求时,它会填充一个 jQuery jqXHR对象。 它将调用它的abort()方法,从而中止请求。

上面的代码适用于 DataTables 1.10,无论表使用 1.10 API 还是 1.9 API。 但是,请注意jqXHR字段不是正式的公共 API 的一部分。 同时,其中一位开发人员在DataTables 论坛上毫无保留地谈论它,因此这可能不是私有 API 中最危险的部分。 完全依赖公共 API 的解决方案会更加麻烦,因为必须修改所有 DataTable 实例以跟踪标记 Ajax 事务开始和结束的事件或具有自定义 Ajax 处理程序等。这将有不仅适用于正在测试的项目的代码,而且适用于提供恰好使用 DataTables 的 HTML 小部件的任何 3rd 方库。

请注意,上面的代码不会阻止DataTables 实例发起请求。 但这不是我所关心的。

我认为更好的方法是在 DataTables 中使用preXhr.dt事件。

$('.datatable').
  on('preXhr.dt', function ( e, settings, data ) {
    if (settings.jqXHR) settings.jqXHR.abort();
}).DataTables({});

我喜欢所选的解决方案,但是当我在注入的 html 请求中加载 Datatable 网格时它不起作用。 我使用 on Search 事件来触发上面提出的代码,它似乎工作正常。

myDataTable.on('search', function () {
            console.log ('Searching aborted');
            //fix to prevent datatables from crashing searches on large data sets
            if (typeof $ !== "undefined" && $.fn.dataTable) {
                let allSettings = $($.fn.dataTable.tables()).DataTable().settings();
                for (let i = 0, settings; (settings = allSettings[i]); ++i) {
                    if (settings.jqXHR)
                        settings.jqXHR.abort();
                }
            }
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM