在前面的文章中,我们分析了jquery的ajax异步和同步,以及一些异常处理。我觉得ajax的readyState和状态还没有说清楚。今天,我们将讨论ajax状态。
jquery ajax函数的源代码如下:
varget XMlhttprequest=function(){ if(window。xmlhttprequest){//主流浏览器提供XMLHttpRequest对象返回新的XMLHttpRequest();} else if(窗口。activexobject){//早期版本的ie浏览器不提供XMLHttpRequest对象//,因此您必须使用IE浏览器ActiveX object的特定实现返回新的activexobject ('microsoft。xmlhttp’);}};var xhr=getXmlHttpRequest();Xhr。onreadystatechange=function(){ if(xhr。readystate===4xhr。status==200){//采集成功后执行操作//数据在xhr.responseText } }xhr.open('TYPE ',' URL ',true);xhr . send(' ');什么是就绪状态
ReadyState是XMLHttpRequest对象的一个属性,用于标识当前XMLHttpRequest对象处于什么状态。
ReadyState总共有五个状态值,范围从0到4,每个状态值代表不同的含义,如下表所示:
0未初始化状态:此时,已经创建了一个XMLHttpRequest对象
1准备发送状态:此时,已经调用了XMLHttpRequest对象的open方法,XMLHttpRequest对象准备向服务器发送请求
2发送状态:此时,已通过send方法向服务器发送请求,但尚未收到响应
3接收状态:此时已收到HTTP响应头信息,但尚未完全收到消息正文
4响应状态完成:此时,HTTP响应的接收已经完成
什么是地位
状态是XMLHttpRequest对象的一个属性,它指示响应的HTTP状态代码。
在HTTP1.1协议下,HTTP状态码可以分为五类,如下表所示:
1XX服务器收到请求,需要继续处理。例如,状态代码101表示服务器将通知客户端使用更高版本的HTTP协议。
2XX请求成功。例如,状态代码200表示请求所期望的响应头或数据体将与该响应一起返回。
3XX重定向。例如,302状态代码表示临时重定向,请求将包含新的URL地址,客户端将对新地址发出GET请求。
4XX客户端错误。例如,状态代码404指示客户端请求的资源不存在。
Xx服务器错误。例如,状态代码500表示服务器遇到了意外情况,导致它无法完成响应。一般来说,当程序代码出错时,就会出现这个问题。
抛出一个问题
onreadyStatechange的函数实现为什么要同时判断readystate和状态?
我们知道readyState===4已经表示请求响应成功。为什么需要后续状态?带着问题,让我们开始做一些实验。
仅使用就绪状态判断
javascript实现代码如下:
var getXmlHttpRequest=function(){ if(window。XMLHttpRequest) {返回新的XMLHttpRequest();} else if(窗口。ActiveXObject) {返回新的ActiveXObject('Microsoft。XMLHTTP’);}};var xhr=getXmlHttpRequest();xhr . onreadystatechange=function(){ if(xhr . readystate===4){ alert(xhr . responsetext);}};xhr.open('GET ','/data.aspx ',true);xhr . send(' ');我们在服务器端抛出了一个异常:
公共部分类数据:系统。Web.UI.Page{受保护的void Page_Load(对象发送方,事件参数e) {引发新异常('错误');}}运行javascript代码,出现如下提示窗口:
服务响应不正确,但仍然返回信息,这不是我们想要的结果。打开Fiddler监控,我们可以看到data.aspx返回500的响应,但是因为它只使用readystate来判断,所以并不关心返回的结果是500还是200。只要响应成功返回,就会执行下面的javascript代码,导致各种意外的错误。因此,单独使用readyState是不可行的。
换个角度看,如果状态码回到200,说明这个响应是成功的。那么,我们可以只使用状态而不使用就绪状态吗?好了,带着问题,继续做实验。
仅使用状态判断
javascript代码实现如下:
var getXmlHttpRequest=function(){ if(window。XMLHttpRequest) {返回新的XMLHttpRequest();} else if(窗口。ActiveXObject) {返回新的ActiveXObject('Microsoft。XMLHTTP’);}};var xhr=getXmlHttpRequest();xhr . onreadystatechange=function(){ if(xhr . status===200){ alert(' readyState=' xhr . readyState xhr . responsetext);}};xhr.open('GET ','/data.aspx ',true);xhr . send(' ');事实上,结果并不像预期的那样。响应代码确实返回了200,但是窗口总共弹出了三次!第一个窗口是“readyState=2”,第二个窗口是“readyState=3Test”,第三个窗口是“readyState=4Test”。因此可以看出,onreadystatechange函数的执行并不是只在readyState变为4时触发,而是readyState的每一次变化都会触发,所以才会出现前述的情况。因此,单独使用状态是不可行的。
进一步思考
从以上实验可以知道,判断时readyState和State缺一不可。readyState和State的判断顺序会有影响吗?我们可以把状态调整到前面,先判断。代码是xhr。状态===200 xhr。ReadyState===4。
其实这对最终结果没有影响,只是中间表现不同。从前面的实验中我们知道,readyState的每一次变化都会触发onreadystatechange函数。如果你先判断状态,那么你每次都会更多的判断状态。虽然对性能影响不大,但我们应该把readyState的判断放在追求最终代码的想法之前。
以上是对readyState和边肖介绍的jQuery Ajax的状态的区别和用法的详细说明。希望对大家有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!