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

时间:2009-11-06 14:49:06

标签: jquery ajax xmlhttprequest

我们的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的情况?我希望能够排除服务器端错误的任何可能性(因为我们的服务器端日志没有显示任何内容),并且要改变错误处理逻辑以不将此方案视为致命错误(导致用户看到一堆大红色警报类型错误消息。)

2 个答案:

答案 0 :(得分:4)

我的猜测是,这是某种问题,其中请求永远不会进入服务器,因此没有带错误代码的响应头,但连接已正确关闭,因此readystate的值为4即防火墙问题或类似的事情。看看这个post,看看我的意思。

答案 1 :(得分:3)

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