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

时间:2014-10-23 15:41:57

标签: javascript jquery ajax datatables system-testing

简要说明

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

详细说明

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

当我进行系统测试时,有时会出现竞争条件:

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

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

  3. 测试运行器运行测试,执行检查并结束。

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

  5. 页面上显示警告,说DataTables遇到Ajax错误。警报说:

  6.   

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

    1. 即使测试实际上是成功的,我的测试系统也不会引起警报,并且会记录失败。 (或者在某些情况下,它会崩溃。)
    2. 我知道这是因为服务器突然中断了Ajax请求。我正在寻找的是一种防止警报首先出现的方法。我想在服务器重置之前停止所有正在进行的DataTables请求

      解决方案已被拒绝

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

      • 修改测试服务器:我更喜欢保持服务器简单,不用担心那里关于可能无法回答的请求。

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

      • 将测试浏览器指向一个没有DataTables的新页面,因为这将中断当前请求:这将再次损害测试性能。

2 个答案:

答案 0 :(得分:12)

解决方案

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

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 forum上没有提出任何警告就这样说了,所以这可能不是私有API所依赖的最危险的部分。纯粹依赖于公共API的解决方案将更加麻烦,因为必须修改所有DataTable实例以跟踪标记Ajax事务开始及其结束或具有自定义Ajax处理程序等的事件。这将具有不仅要对正在测试的项目的代码进行处理,还要提供任何提供碰巧使用DataTables的HTML小部件的第三方库。

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

答案 1 :(得分:3)

我认为更好的方法是使用DataTables中的view the Codepen事件。

{{1}}