【问题标题】:jQuery ajax() call occasionally results in error with XmlHttpRequest response status of 0jQuery ajax() 调用偶尔会导致 XmlHttpRequest 响应状态为 0 的错误
【发布时间】:2010-12-13 20:53:00
【问题描述】:

我们的 Web 应用程序中的一个页面使用 jQuery 的 ajax() 方法大约每 10 秒轮询一次服务器以获取新数据。我们通常有几百个用户同时查看这个页面,所以我们的服务器每秒接收几个请求。负载不是任何问题。

对于我们的一小部分访问者,jQuery ajax() 调用偶尔会触发它的错误事件。这些错误事件中的大多数都是明显的错误(例如访问者遇到网络问题时超时),但其中一小部分我很难找到原因,而且我有点困惑。

我们正在像这样连接一个全局错误监听器

$.ajaxSetup({ 
    timeout: oursettings.timeout,
    error: function(xhr, status, e){
         // error handling goes here
    }
});

对于这个特定的错误子集,jQuery 向我们抛出了 status"error"。通过jQuery source code 读取(特别是第 3574 行),仅当 XmlHttpRequest 就绪状态的值为4(意味着它是DONE)并且 HTTP 响应状态不在成功范围内时,才会使用此值引发错误值(< 200>= 300)。

但是,当我们检查 XmlHttpRequest 对象本身时,我们发现它的(HTTP 响应)状态为0。根据 XHR 规范,the "error flag is true" 时的状态应设置为 0。

这是我真正感到困惑的地方,因为the only other thing XmlHttpRequest 规范中关于“错误标志”的声明是

DONE 状态有一个相关的错误标志,指示某种类型的网络错误或中止。可以是真也可以是假,初始值为假。

规范没有说明保存该错误标志的属性或位置(即,它是否在 xhr.error 中可用?)。

所以我想我的问题归结为:对于我们的 ajax-error-handling 代码来说,假设任何事件以"error" 的 jQuery 状态和 xhr.statusxhr.status 触发我们的错误处理程序,这是否正确? 987654337@ 仅由“网络错误或中止”引起

是否有任何其他条件或任何其他人看到的可能导致 XmlHttpRequest 就绪状态为 DONE (4) 且 HTTP 响应状态为 0?我希望能够排除任何服务器端错误的可能性(因为我们的服务器端日志没有显示任何内容),并更改错误处理逻辑以不将此场景视为致命错误(导致用户看到一堆大红色警报类型的错误消息)。

【问题讨论】:

    标签: jquery ajax xmlhttprequest


    【解决方案1】:

    我的猜测是,这是某种问题,请求从未到达服务器,因此没有带有错误代码的响应标头,但连接已正确关闭,因此 readystate 的值为 4,即防火墙问题或类似的东西。看看这个post 看看我的意思。

    【讨论】:

      【解决方案2】:

      我们发现此特定状态代码可能是由于用户在 AJAX 调用完成之前离开页面(例如,单击后退按钮)造成的。

      【讨论】:

      • 对我们来说也是如此。有什么方法可以确定发生了什么(即浏览器终止了 ajax 请求,因为页面由于用户导航而正在卸载)?检查 xhr.status == 0 似乎有风险
      猜你喜欢
      • 2016-08-08
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2013-01-29
      • 2015-07-14
      相关资源
      最近更新 更多