jQuery ajax()调用偶尔会导致错误,XmlHttpRequest响应状态为0

mat*_*t b 9 ajax jquery xmlhttprequest

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

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

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

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

对于这个特定的错误子集,jQuery给我们带来了status一些"error".通过jQuery源代码(特别是第3574行)读取错误仅在XmlHttpRequest readystate具有值4(意味着它DONE)并且HTTP响应状态超出成功值(< 200>= 300)时使用此值抛出.

但是,当我们检查XmlHttpRequest对象本身时,我们发现它的(HTTP响应)状态为0.根据XHR规范,当"错误标志为真",应设置状态0 .

这是我真的很困惑的地方,因为XmlHttpRequest规范中关于"错误标志" 的唯一其他事情

DONE状态具有相关的错误标志,指示某种类型的网络错误或堕胎.它可以是true或false,初始值为false.

规范没有说明保留这个错误标志的属性或位置(即,它是否可用xhr.error?).

所以我想我的问题归结为:这将是正确的我们的Ajax的错误处理代码假设击中我们的错误处理程序与jQuery的状态的任何事件"error"xhr.status0,以引起通过"网络错误或流产"?

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

Rya*_*nch 4

我的猜测是,这是某种问题,请求永远不会到达服务器,因此没有带有错误代码的响应标头,但连接已正确关闭,因此就绪状态的值为 4,即防火墙问题或其他问题像那样。看看这篇文章就知道我的意思了。