www.baike369.com
百科369 > Ajax教程 > XMLHttpRequest(XHR)对象的status和statusText属性

XMLHttpRequest(XHR)对象的status和statusText属性


XMLHttpRequest(XHR)对象的status和statusText属性

通过查看XHR的status和statusText属性可以确认响应是成功的还是失败的。status属性包含大量的HTTP状态值,如200、404和500等,而statusText属性包含对应的消息或者原因的文本,诸如“OK”、“Not Found”、“Unavailable”和“No Data”等。

通常,在Ajax应用程序中使用这些值的方式显得稍微有点初级,通常要确保XHR的响应状态值是200(200表示OK状态),并且在其它所有失败的情况下,使用这样的代码:

function handleResponse(xhr)
{
  if(xhr.readyState==4&&xhr.status==200)
  {
    // consume the response
  }
}

然而,我们也可能会基于这个状态值,选择把更智能的功能添加到Ajax应用程序中。例如,考虑某些错误的情况,当服务器正在忙碌时,可能会返回像503“Service Unavailable”(服务不可用)这样的错误信息,我们可能会决定在超过一定的时间之后,需要自动地为用户重新尝试发出请求。我们也可能会发现,某些状态值会建议让用户知道事实上确实发生了什么情况,而不仅仅是生成一个像“Request Failed”(请求失败)这样的含糊不清的异常信息。

为了重构这个回调函数,可以首先检查readyState,然后仔细查看状态值,就像这样:

function handleResponse(xhr)
{
  if(xhr.readyState==4)
  {
    try{
      switch(xhr.status)
      {
        case 200: // consume response
                  break;
        case 403:
        case 404: // error
                  break;
        case 503: // error but retry
                  break;
        default: //error
      }
    }
    catch(e){/*error*/}
  }
}

然而,正如随后将要看到的那样,即使非常熟悉典型的HTTP状态代码,在某些情况下这也可能不够。


不常用的状态值

正如总是提醒我们的那样,在Internet中可能出现任何数量的网络问题。某些XHR的实现提供了奇怪的状态值,它们在某些极端的情况下可能是有用的。Internet Explorer实现的状态值显示在下表中,这对于检测错误条件是很有用的:

IE的status属性值对应的statusText值
12002 ERROR_INTERNET_TIMEOUT
12007 ERROR_INTERNET_NAME_NOT_RESOLVED
12029 ERROR_INTERNET_CANNOT_CONNECT
12030 ERROR_INTERNET_CONNECTION_ABORTED
12031 ERROR_INTERNET_CONNECTION_RESET
12152 ERROR_HTTP_INVALID_SERVER_RESPONSE

应该注意到,这些状态代码(status code)和任何标准的HTTP状态代码都没有联系,并且实际上会用来表示TCP层(TCP level)的问题,并作为报告反馈给WinInet,这是IE使用的驱动XHR的方式。这些值使得应用程序层(application-level)的编程人员可以洞察到正在进行的连接的内容,这样就可以决定适当地处理这些事情。可以在https://msdn.microsoft.com/en-us/library/aa385465.aspx上看到这些代码的完整列表,但是上表中显示的是在实践中可能会遇到的情况。

不管是标准还是非标准,IE的不常用代码看上去似乎很有用,但其它浏览器的情况又会如何?它们是如何处理网络问题的?例如,考虑这样的情况,如果由于服务器已经关闭或者网络路由的某些问题而造成连接没有完成,那么会发生什么呢?Firefox最终将会调用onreadystatechange并且甚至会把状态设置为4,但是对状态值的检查将会引发一个异常。Opera也会将readyState设置为4,但是对应状态的值将会是零。IE也将会把readyState设置为4,但是将会用状态代码12029通知我们究竟发生了什么。可以添加一个try-catch语句块来解决这个问题:

if(xhr.readyState==4)
{
  try{
    if(xhr.status==200)
    {
      // consume response
    }
  }
  catch(e){alert("Network error");}
}

其它情况可能不会如此容易。如果出现了网络错误或者在请求过程中服务器崩溃了,那么将会发生什么呢?IE将会用状态值12152或可能是12031来通知我们出现了什么样的问题,但是像Firefox这样的浏览器可能不会正确地报告这些情况,特别是在已经返回某些报头时,更是如此。甚至可能会出现status属性中代码为200、readyState为4,却没有合理的数据可以使用的情况。

如果服务器断线和其它错误都可以导致出现状态代码为200的情况,在这样的边缘的情况下,看上去处理这些事情似乎是非常困难的。但如果这样的情况可能发生,我们是如何知道Ajax的请求是成功的呢?如果在responseText中存在内容,就可以使用类似try-catch的语句块来仔细地检查它了。


204状态的怪异之处和更多的内幕

在仅仅“ping”一个服务器并且无需用数据进行响应的应用程序中,使用204“No Data”(没有数据)响应非常有用。尽管这种类型的响应经常用在利用XHR的传统JavaScript通信模式中,但还有不少麻烦的怪异之处。例如,在Opera中,可能会出现状态0且无法正确调用onreadystatechange的情况,而在IE中,可能会收到奇怪的1223状态值。当逐渐深入细节时,就不应该再认为这是理所当然的了。

Copyright© 2011-2016 www.baike369.com All Rights Reserved