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

简要描述;简介

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

详细说明

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

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

  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请求时,该jqXHR填充了jQuery jqXHR对象。 它会调用abort()方法,从而中止请求。

上面的代码适用于DataTables 1.10,无论表是使用1.10 API还是1.9 API。 但请注意, jqXHR字段不是公共API的正式部分。 与此同时,其中一个开发者在DataTables论坛上没有提出任何警告就这样说,所以这可能不是私有API所依赖的最危险的部分。 纯粹依赖于公共API的解决方案将更加麻烦,因为必须修改所有DataTable实例以跟踪标记Ajax事务开始及其结束或具有自定义Ajax处理程序等的事件。这将具有不仅要对正在测试的项目的代码进行处理,还要提供任何提供碰巧使用DataTables的HTML小部件的第三方库。

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

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

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