Javascript 如何停止DataTables实例启动的所有当前正在进行的Ajax查询? 简述
将测试服务器重置为已知状态会导致测试失败,因为在重置服务器时,DataTables实例启动的Ajax请求正在进行中。我想通过在服务器重置之前停止DataTables请求来防止这种情况 详细说明 我有一个在某些页面上使用数据表的应用程序。这些数据表都执行服务器端查询以填充其表 当我执行系统测试时,有时会出现竞争情况:Javascript 如何停止DataTables实例启动的所有当前正在进行的Ajax查询? 简述,javascript,jquery,ajax,datatables,system-testing,Javascript,Jquery,Ajax,Datatables,System Testing,将测试服务器重置为已知状态会导致测试失败,因为在重置服务器时,DataTables实例启动的Ajax请求正在进行中。我想通过在服务器重置之前停止DataTables请求来防止这种情况 详细说明 我有一个在某些页面上使用数据表的应用程序。这些数据表都执行服务器端查询以填充其表 当我执行系统测试时,有时会出现竞争情况: 测试运行程序启动测试服务器 测试运行程序在测试浏览器中加载一个页面,该页面上某处有一个DataTable实例 测试运行程序运行测试,测试执行检查并结束 测试运行程序将测试服务器重置为
- 告诉DataTables实例不要使用警报:如果DataTables实例遇到与重置测试服务器无关的问题,我希望我的测试失败
- 修改测试服务器:我更喜欢保持服务器的简单性,而不担心可能无法响应的请求
- 在客户端等待所有请求结束:这会大大降低测试的速度,特别是当这种等待重复了几十个测试时
- 将测试浏览器指向一个新页面,该页面上没有数据表,因为这将中断当前请求:这同样会影响测试性能
jqXHR
,当发出Ajax请求时,该对象将被jQuery对象填充。它将对其调用abort()
方法,从而中止请求
上面的代码适用于DataTables 1.10,无论这些表使用的是1.10API还是1.9API。但是,请注意,jqXHR
字段不是公共API的正式部分。同时,其中一位开发人员毫无保留地谈到了它,因此这可能不是私有API中最危险的部分。而一个完全依赖公共API的解决方案将更加麻烦,因为所有DataTable实例都必须进行修改,以跟踪标记Ajax事务开始和结束的事件,或者具有定制的Ajax处理程序,等等。这不仅要针对测试项目的代码,而且要针对任何第三方库,提供碰巧使用DataTables的HTML小部件
$('.datatable').
on('preXhr.dt', function ( e, settings, data ) {
if (settings.jqXHR) settings.jqXHR.abort();
}).DataTables({});
请注意,上面的代码并不阻止DataTables实例启动新请求。但我并不担心这一点 我认为更好的方法是在数据表中使用事件
$('.datatable').
on('preXhr.dt', function ( e, settings, data ) {
if (settings.jqXHR) settings.jqXHR.abort();
}).DataTables({});
我不这么认为。我看到,
preXhr
是“在DataTables向服务器发出Ajax数据请求之前”发出的。如果我使用最初设置表时显示的代码,那么我将预先中止所有Ajax请求,测试将失败,因为我的表无法工作。如果我在完成测试后添加侦听器,那么问题是我只会中止未来的请求。测试期间生成的请求在测试结束时仍未解决。我需要中止这些操作以避免报告的错误。@实际上,上面的代码可以工作。只有当另一个ajax请求已经在运行时,它才会中止ajax请求。因此,如果ajax请求为页面加载触发一次,它不会“停止”页面的工作。如果一行中有5个ajax请求,那么前4个请求将被取消(使用.abort()
),第5个请求将运行并返回数据。我已经在一个应用程序中尝试过,并用浏览器控制台的“网络”选项卡对其进行了监视。@Andy为了使事情正常工作,不应中止4个初始Ajax请求,这样表实际上是可测试的,但应中止第5个请求,这样在测试结束后运行的任何后续Ajax请求都将从客户端中止,而不是因为服务器在重置连接时突然关闭连接而出错。您描述的行为与期望的行为完全相反。当然,初始行为应该中止。任何早于最新请求启动的内容基本上都是无用的,因为它生成的数据与搜索条件不匹配!我的应用程序通过附加到表单的.keyup
事件发送请求。如果用户键入“abcde”,则不需要发送了“a”、“ab”、“abc”、“abcd”的4个ajax请求,因为这些请求不会为用户生成正确的结果。任何早于最新请求的内容都应中止。我正在处理一个应用程序