一尘不染

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

ajax

简要描述;简介

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

详细说明

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

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

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

  2. 测试运行程序在测试浏览器中加载页面,该页面上有DataTable实例。

  3. 测试运行程序运行测试,执行测试并结束。

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

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

DataTables警告:表ID =
[某些ID]-Ajax错误。有关此错误的更多信息,请参见http://datatables.net/tn/7

  1. 我的测试系统不希望收到警报,但是即使测试实际上是成功的,也很混乱并记录了一个失败。(或者在某些情况下,它会崩溃。)

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

解决方案已被拒绝

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

  • 修改测试服务器:我宁愿保持服务器简单,也不必担心 那里的 请求可能无法得到答复。

  • 等待客户端所有请求结束:这可能会大大降低测试速度,尤其是当数十次测试重复此等待时。

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


阅读 184

收藏
2020-07-26

共1个答案

一尘不染

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

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

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

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

2020-07-26