我们的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 readystate的值为4
(意味着它是DONE
)和HTTP响应时,只会使用此值抛出错误状态超出了成功值(< 200
或>= 300
)。
但是,当我们检查XmlHttpRequest对象本身时,我们发现它的(HTTP响应)状态为0
。根据XHR规范,the "error flag is true"时应设置状态0。
这是我感到非常困惑的地方,因为XmlHttpRequest规范中关于“错误标志”的the only other thing是
DONE状态有一个相关的错误标志,指示某种类型的网络错误或堕胎。它可以是true或false,初始值为false。
规范未说明保留此错误标志的属性或位置(即xhr.error
中是否可用?)。
所以我想我的问题归结为:我们的ajax错误处理代码假设任何触发我们的错误处理程序的事件是jQuery状态为"error"
和{{1由{网络错误或堕胎“引起的xhr.status
仅?
是否有任何其他条件或其他任何人看到的可能导致XmlHttpRequest readystate为0
且HTTP响应状态为0的情况?我希望能够排除服务器端错误的任何可能性(因为我们的服务器端日志没有显示任何内容),并且要改变错误处理逻辑以不将此方案视为致命错误(导致用户看到一堆大红色警报类型错误消息。)
答案 0 :(得分:4)
我的猜测是,这是某种问题,其中请求永远不会进入服务器,因此没有带错误代码的响应头,但连接已正确关闭,因此readystate的值为4即防火墙问题或类似的事情。看看这个post,看看我的意思。
答案 1 :(得分:3)
我们发现这个特定的状态代码可能是由于用户在AJAX调用完成之前导航离开页面(例如,单击后退按钮)。