2009-11-06 54 views
9

我们的Web应用程序中的一个页面大约每10秒钟对新数据进行轮询,使用jQuery的ajax()方法。我们通常有几百个用户同时查看此页面,因此我们的服务器每秒接收几个请求。负载不是任何问题。jQuery ajax()调用偶尔会导致XmlHttpRequest响应状态为0的错误

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

我们连线了一个全球性的错误监听像这样

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

错误的这个特定子集,jQuery是扔我们的"error"一个status。当XmlHttpRequest readystate的值为4(意味着它是DONE)并且HTTP响应状态在成功值之外(< 200>= 300)时,通过jQuery source code(特别是第3574行)读取错误仅以此值抛出。 。

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

这是我得到真的很困惑,但因为the only other thing这对“错误标志”的XmlHttpRequest的规范状态是

完成状态具有指示某种类型的网络错误或相关联的错误标志流产。它可以是真或假,并具有假的初始值。

该规范没有说明什么属性或这个错误标志保留在哪里(即它是否可用xhr.error?)。

所以我想我的问题归结为:这将是正确的我们的Ajax的错误处理代码假设击中我们的错误处理程序与"error"一个jQuery状态和0一个xhr.status任何事件所引起只有通过“network error or abortion”?

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

回答

4

我的猜测是,这是某种问题,请求永远不会将它发送到服务器,因此没有响应标头,并显示错误代码,但连接已正确关闭,因此readystate的值为4,即a防火墙问题或类似的东西。看看这个post看看我的意思。

+0

还有更多,请参阅http://stackoverflow.com/a/14507670/700206 – Lee

3

我们发现,在AJAX调用完成之前,用户导航离开页面(比如说,点击后退按钮)可能会导致此特定状态码。

+0

我们也一样。有什么办法可以确定发生了什么(即浏览器终止了Ajax请求,因为页面由于用户导航而卸载)?检查xhr.status == 0似乎有风险 – chadmyers

相关问题