连接丢失后,ajax 请求在 chrome 中挂起

Posted

技术标签:

【中文标题】连接丢失后,ajax 请求在 chrome 中挂起【英文标题】:ajax requests hangs in chrome after connection lost 【发布时间】:2018-03-22 23:27:49 【问题描述】:

我注意到 google chrome 中有一些奇怪的行为:

如果我们在没有网络连接的情况下发送 ajax 后请求,我们会在控制台中收到 err_internet_disconnected 异常(我认为,没关系) 如果我们在这个请求期间发送了长的 ajax 请求并失去了网络连接,谷歌浏览器不会中止它,控制台和 devconsole 的网络选项卡中没有 err_internet_disconnected 异常,这个请求被标记为待处理(即使在连接出现之后) .事实上,这个连接挂了,没有机会在 js 代码中处理这个(我们期望得到 ajax 错误,但没有任何反应)。

您对如何处理这种行为有什么建议吗?

编辑: 代码示例:

$.ajax(
   url: "https://someserver.com/ws.asmx/ExecuteEx?pureJson",
   type: "POST",
   contentType: "application/json",
   data: data,
   success: function() 
      console.log("success");
   ,
   error: function() 
      console.log("error");
   
)

我在编辑这篇文章时在此页面的 chrome 开发控制台中尝试了此代码。截图如下。 第一个请求是我的。我发送了它,然后拔下网线。 第二个请求失败(因为拔掉了网线)。 然后我插入网线,第三次请求成功。但是第一个请求仍然处于待处理状态(尽管网络连接丢失)。

devconsole's network tab

【问题讨论】:

你能发布你的ajax代码吗? @DiskJunky ,是的,我已经编辑了这篇文章 您是否设置了timeout 属性?见Set timeout for ajax (jQuery)。如果超时后连接丢失,那应该中止请求。您是否也测试过任何其他浏览器,例如 FireFox 或 IE? 至少 FireFox 具有相同的行为。我知道“超时”属性,但即使需要数小时来处理服务器上的请求,我们也需要得到结果。但是你提到的 timeout 属性让我知道如何使用 timeout 绕过这个问题。 【参考方案1】:

设置timeout 属性。如果超时后连接丢失,则应该中止请求。

$.ajax(
   url: "https://someserver.com/ws.asmx/ExecuteEx?pureJson",
   type: "POST",
   contentType: "application/json",
   data: data,
   timeout: 1000, // value in milliseconds
   success: function() 
      console.log("success");
   ,
   error: function() 
      console.log("error");
   
)

另见ajax documentation

超时

为请求设置超时(以毫秒为单位)。值为 0 表示不会有超时。这将覆盖使用 $.ajaxSetup() 设置的任何全局超时。超时时间从 $.ajax 调用开始;如果有几个其他请求正在进行,并且浏览器没有可用的连接,则请求可能会在发送之前超时。

【讨论】:

如果等待时间增加(超过 1000 毫秒超时),ajax 会发生什么? ajax 会继续处理请求吗?如果我们不拔掉连接会发生什么?并且 ajax 不断请求服务器和 xhr 在控制台中以红色显示(待处理)?如何处理?以及如何复制/测试这种情况? @CuriousDeveloper - 现有问题的 cmets 不是询问您的问题或任何新问题的正确位置。请使用您的具体和相关详细信息打开一个新问题。另请参阅How to Ask。【参考方案2】:

尝试替换$中的错误函数。 Ajax(用这段代码比较结果

error: function (request, status, error) 
        console.log(request.responseText);
        console.log(request.status);
        console.log(request.error);
    

希望对你有所帮助。

【讨论】:

没用(

以上是关于连接丢失后,ajax 请求在 chrome 中挂起的主要内容,如果未能解决你的问题,请参考以下文章

Julia 在 HTTP WebSocket 块中挂起异常

jQuery Ajax 发布请求在 Chrome 上挂起

saveAsTextFile 在 spark java.io.IOException 中挂起:数据框中的对等方重置连接

Chrome 中 JQuery 停止和挂起的 ajax 请求

Psycopg2 db连接在丢失的网络连接上挂起

更新查询在node-oracledb模块中挂起