Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何停止DataTables实例启动的所有当前正在进行的Ajax查询? 简述_Javascript_Jquery_Ajax_Datatables_System Testing - Fatal编程技术网

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

Javascript 如何停止DataTables实例启动的所有当前正在进行的Ajax查询? 简述,javascript,jquery,ajax,datatables,system-testing,Javascript,Jquery,Ajax,Datatables,System Testing,将测试服务器重置为已知状态会导致测试失败,因为在重置服务器时,DataTables实例启动的Ajax请求正在进行中。我想通过在服务器重置之前停止DataTables请求来防止这种情况 详细说明 我有一个在某些页面上使用数据表的应用程序。这些数据表都执行服务器端查询以填充其表 当我执行系统测试时,有时会出现竞争情况: 测试运行程序启动测试服务器 测试运行程序在测试浏览器中加载一个页面,该页面上某处有一个DataTable实例 测试运行程序运行测试,测试执行检查并结束 测试运行程序将测试服务器重置为

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

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

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

  • 测试运行程序启动测试服务器

  • 测试运行程序在测试浏览器中加载一个页面,该页面上某处有一个DataTable实例

  • 测试运行程序运行测试,测试执行检查并结束

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

  • 页面上会显示一个警报,表示DataTables遇到Ajax错误。警报说:

  • DataTables警告:表id=[某些id]-Ajax错误。有关此错误的详细信息,请参阅

  • 我的测试系统不希望出现警报,但它很混乱,并且记录了一个失败,即使测试实际上是成功的。(或者在某些情况下,它会崩溃。)
  • 我知道发生这种情况是因为服务器突然中断了Ajax请求。我正在寻找的是一种从一开始就防止警报出现的方法。我想在服务器重置之前停止所有正在进行的DataTables请求。

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

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

    • 在客户端等待所有请求结束:这会大大降低测试的速度,特别是当这种等待重复了几十个测试时

    • 将测试浏览器指向一个新页面,该页面上没有数据表,因为这将中断当前请求:这同样会影响测试性能

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

    解释 即使在未加载jQuery或未加载DataTables的页面上执行,代码也可以正常运行。因此,它首先检查它们是否已加载,如果未加载,则不会执行任何操作。然后它获取所有DataTable实例的设置对象。在每个settings对象中,它检查是否存在
    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请求,因为这些请求不会为用户生成正确的结果。任何早于最新请求的内容都应中止。我正在处理一个应用程序