ajax readyState的五种状态详解

在《Pragmatic
Ajax A Web 2.0 Primer 》中对readyStae状态的介绍,摘译如下: 
0:
(Uninitialized) the send( ) method has not yet been invoked. 
1:
(Loading) the send( ) method has been invoked, request in progress. 
2:
(Loaded) the send( ) method has completed, entire response received. 
3:
(Interactive) the response is being parsed. 
4:
(Completed) the response has been parsed, is ready for harvesting. 
0
- (未初始化)还没有调用send()方法 
1
- (载入)已调用send()方法,正在发送请求 
2
- (载入完成)send()方法执行完成,已经接收到全部响应内容 
3
- (交互)正在解析响应内容 
4
- (完成)响应内容解析完成,可以在客户端调用了 
对于readyState的这五种状态,其他书中大都语焉不详。像《Foundations
of Ajax》中,只在书中的表2-2简单地列举了状态的“名称”--The state of the request. The five possible
values are 0 = uninitialized, 1 = loading, 2 = loaded, 3 = interactive, and 4 =
complete。而《Ajax in Action》中好像根本就没有提到这5种状态的细节。 
《Professional
Ajax》中虽不尽人意,但还是有可取之处: 
There
are five possible values for readyState: 
0
(Uninitialized): The object has been created but the open() method hasn‘t been
called. 
1
(Loading): The open() method has been called but the request hasn‘t been
sent. 
2
(Loaded): The request has been sent. 
3
(Interactive). A partial response has been received. 
4
(Complete): All data has been received and the connection has been closed. 
readyState有五种可能的值: 
0
(未初始化): (XMLHttpRequest)对象已经创建,但还没有调用open()方法。 
1
(载入):已经调用open() 方法,但尚未发送请求。 
2
(载入完成): 请求已经发送完成。 
3
(交互):可以接收到部分响应数据。 
4
(完成):已经接收到了全部数据,并且连接已经关闭。 
在《Understanding
AJAX: Using JavaScript to Create Rich Internet Applications》中,则用下表进行了说明: 
readyState
Status Code 
Status
of the XMLHttpRequest Object 
(0)
UNINITIALIZED 未初始化 
The
object has been created but not initialized. (The open method has not been
called.) 
(XMLHttpRequest)对象已经创建,但尚未初始化(还没有调用open方法)。 
(1)
LOADING 载入 
The
object has been created, but the send method has not been called. 
(XMLHttpRequest)对象已经创建,但尚未调用send方法。 
(2)
LOADED 载入完成 
The
send method has been called, but the status and headers are not yet
available. 
已经调用send方法,(HTTP响应)状态及头部还不可用。 
(3)
INTERACTIVE 交互 
Some
data has been received. Calling the responseBody and responseText properties at
this state to obtain partial results will return an error, because status and
response headers are not fully available. 
已经接收部分数据。但若在此时调用responseBody和responseText属性获取部分结果将会产生错误,因为状态和响应头部还不完全可用。 
(4)
COMPLETED 完成 
All
the data has been received, and the complete data is available in the
responseBody and responseText properties. 
已经接收到了全部数据,并且在responseBody和responseText属性中可以提取到完整的数据。 
根据以上几本书中的关于readyState五种状态的介绍,我认为还是《Pragmatic
Ajax A Web 2.0 Primer
》比较到位,因为它提到了对接收到的数据的解析问题,其他书中都没有提到这一点,而这一点正是“(3)交互”阶段作为一个必要的转换过程存在于“(2)载入完成”到“(4)完成”之间的理由,也就是其任务是什么。归结起来,我觉得比较理想的解释方法应该以“状态:任务(目标)+过程+表现(或特征)”表达模式来对这几个状态进行定义比较准确,而且让人容易理解。 
总结如下: 
readyState
状态 状态说明 
(0)未初始化 
此阶段确认XMLHttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备。值为0表示对象已经存在,否则浏览器会报错--对象不存在。 
(1)载入 
此阶段对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。 
(2)载入完成 
此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。值为2表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。 
(3)交互 
此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responseXML属性存取的格式,为在客户端调用作好准备。状态3表示正在解析数据。 
(4)完成 
此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过XMLHttpRequest对象的相应属性取得数据。 
概而括之,整个XMLHttpRequest对象的生命周期应该包含如下阶段: 
创建-初始化请求-发送请求-接收数据-解析数据-完成 
在具体应用中,明确了readyState的五个状态(XMLHttpRequest对象的生命周期各个阶段)的含义,就可以消除对Ajax核心的神秘感(语焉不详的背后要么是故弄玄虚,制造神秘感;要么就是“以其昏昏,使人昭昭”),迅速把握其实质,对减少学习中的挫折感和增强自信心都极其有益。 
比如,通过如下示例: 
程序代码 
//声明数组 
var
states = ["正在初始化……", 
"正在初始化请求……成功!<br/>正在发送请求……", 
"成功!<br/>正在接收数据……", 
"完成!<br/>正在解析数据……", 
"完成!<br/>"]; 
//回调函数内部代码片段 
if
(xmlHttp.readyState==4) 

var
span = document.createElement(“span”); 
span.innerHTML
= states[xmlHttp.readyState]; 
document.body.appendChild(span); 
if
(xmlHttp.status == 200) 

var
xmldoc = xmlHttp.responseXML; 
//其他代码 

//别忘记销毁,防止内存泄漏 
xmlHttp
= null; 

else 

var
span = document.createElement(“span”); 
span.innerHTML
= states[xmlHttp.readyState]; 
document.body.appendChild(span); 

结果如下: 
正在初始化请求……成功! 
正在发送请求……成功! 
正在接收数据……完成! 
正在解析数据……完成! 
我们很容易明白XMLHttpRequest对象在各个阶段都在做什么。因此,也就很容易对Ajax的核心部分有一个真正简单明了的理解。 
附: 
Example

readyState
返回XMLHTTP请求的当前状态 
语法
lValue = oXMLHttpRequest.readyState; 
程序代码 
var
XmlHttp; 
XmlHttp
= new ActiveXObject("Msxml2.XMLHTTP.3.0"); 
function
send() { 
XmlHttp.onreadystatechange
= doHttpReadyStateChange; 
XmlHttp.open("GET",
"http://localhost/sample.xml", true); 
XmlHttp.send(); 

function
doHttpReadyStateChange() { 
if
(XmlHttp.readyState == 4) { 
alert("Done"); 


备注
变量,此属性只读,状态用长度为4的整型表示.定义如下: 
0
(未初始化) 对象已建立,但是尚未初始化(尚未调用open方法) 
1
(初始化) 对象已建立,尚未调用send方法 
2
(发送数据) send方法已调用,但是当前的状态及http头未知 
3
(数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误, 
4
(完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据 
Example

下面这个范例说明如何在运行时以
VBScript 代码读取 RDS.DataControl 对象的 ReadyState 属性。ReadyState 为只读属性。 
要测试该范例,请剪切该代码并粘贴到标准
HTML 文档的 <Body></Body> 标记之间,然后将其命名为“ADCapi9.asp”,ASP 脚本将标识服务器。 
程序代码 
<Center> 
<H2>RDS
API Code Examples </H2> 
<HR> 
<H3>
RDS.DataControl ReadyState property</H3> 
</Center> 
<!--
在运行时设置参数的 RDS.DataControl --> 
<OBJECT
classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" 
ID=ADC> 
<PARAM
NAME="SQL" VALUE="Select * from Employee for browse"> 
<PARAM
NAME="SERVER"
VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>"> 
<PARAM
NAME="CONNECT" VALUE="dsn=ADCDemo;UID=ADCDemo;PWD=ADCDemo;"> 
<PARAM
NAME="ExecuteOptions" VALUE="adcExecAsync"> 
<PARAM
NAME="FetchOptions" VALUE="adcFetchAsync"> 
</OBJECT> 
<Script
Language="VBScript"> 
Sub
Window_OnLoad 
Select
Case ADC1.ReadyState 
case
2: MsgBox "Executing Query" 
case
3: MsgBox "Fetching records in background" 
case
4: MsgBox "All records fetched" 
End
Select 
End
Sub 
</Script>

时间: 2024-10-08 20:50:28

ajax readyState的五种状态详解的相关文章

XMLHTTP.readyState的五种状态

XMLHTTP.readyState的五种状态 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

网络互联技术(四)-LSA的第四和第五种类型详解

LSA的第四和第五种类型详解 一.External LSA:第五种LSA 我们前面已经详细介绍了前面三种LSA,今天就接着介绍第四种和第五种LSA.因为理解ASBR Summary LSA--第四种LSA需要涉及External LSA的一些知识,所以我们先介绍第五种LSA,然后再回过头来看第四种LSA. External LSA由ASBR(Autonomous System Border Router,自治系统边界路由器,我们前面说过了OSPF网络就是一个自治系统)产生.它是用来通告OSPF网

Hibernate 的三种状态详解

hibernate的对象有3种状态,分别为:瞬时态(Transient).持久态(Persistent).脱管态(Detached). 处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object). 瞬时态 由new命令开辟内存空间的java对象, eg. Person person = new Person("xxx", "xx"); 如果没有变量对该对象进行引用,它将被java虚拟机回收. 瞬时对象

线程的5种状态详解

Java中的线程的生命周期大体可分为5种状态. 1. 新建(NEW):新创建了一个线程对象. 2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法.该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 . 3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码.4. 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了

angular五种服务详解

在这之前angular学习笔记(十五)-module里的'服务'这篇文章里,已经大致讲解了ng中的'服务',在之后的很多地方也用到了服务,但是,所有的服务都是使用app.factory来创建的.但其实,创建服务有5种方法,这篇文章就来具体讲解ng中的五种服务类型. 首先,为了举栗子,先写好如下的模型,控制器,html: html: <!DOCTYPE html> <html ng-app="serviceApp"> <head> <title&

Redis五种数据结构详解

总结了下Redis五种数据结构的特定,本文主要参考 <redis in action>. 字符串 首先,字符串类型是最基础的类型,在redis里面字符串可以存储3中类型的值,字节串.整数.浮点数.这里整数或者浮点数是可以执行自增或自减的. 字符串常用命令 列表 列表类似于数据结构的链表,可以给定int范围去显示这个列表中的数据.列表允许用户从序列的两端推入或者弹出元素,获取列表元素,以及执行各种常见的列表操作. 列表经常用来存储任务信息.最近浏览过的文章或者联系人信息等. 列表的一个主要优点在

Android特效 五种Toast详解

Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失. 1.默认效果: 代码:Toast.makeText(getApplicationContext(), "默认Toast样式",     Toast.LENGTH_SHORT).show(); 2.自定义显示位置效果: 代码:toast = Toast.makeText(getApplicationContext(),    

Js--AJAX的小知识(一):ajax的五种状态

一.ajax的五种状态(readyState ) 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成,已经接收到全部响应内容 3 - (交互)正在解析响应内容 4 - (完成)响应内容解析完成,可以在客户端调用了 readyState 状态说明 (0)未初始化 此阶段确认XMLHttpRequest对象是否创建,并未调用open()方法进行未初始化作好准备.值未0表示对象已经存在,否则浏览器会报错--

ajax的五种状态

ajax的五种状态(readyState ) 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成,已经接收到全部响应内容 3 - (交互)正在解析响应内容 4 - (完成)响应内容解析完成,可以在客户端调用了 readyState 状态说明 (0)未初始化 此阶段确认XMLHttpRequest对象是否创建,并未调用open()方法进行未初始化作好准备.值未0表示对象已经存在,否则浏览器会报错---对