【发布时间】: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.status 的 xhr.status 触发我们的错误处理程序,这是否正确? 987654337@ 仅由“网络错误或中止”引起?
是否有任何其他条件或任何其他人看到的可能导致 XmlHttpRequest 就绪状态为 DONE (4) 且 HTTP 响应状态为 0?我希望能够排除任何服务器端错误的可能性(因为我们的服务器端日志没有显示任何内容),并更改错误处理逻辑以不将此场景视为致命错误(导致用户看到一堆大红色警报类型的错误消息)。
【问题讨论】:
标签: jquery ajax xmlhttprequest