javascript ajax的5种状态介绍


Posted in Javascript onAugust 18, 2014

在《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 (未初始化): (xml(标准化越来越近了)HttpRequest)对象已经创建,但还没有调用open()方法。
1 (载入):已经调用open() 方法,但尚未发送请求。
2 (载入完成): 请求已经发送完成。
3 (交互):可以接收到部分响应数据。
4 (完成):已经接收到了全部数据,并且连接已经关闭。

在《Understanding ajax(动态网站静态化): Using JavaScript to Create Rich Internet Applications》中,则用下表进行了说明:

readyState Status Code
Status of the xml(标准化越来越近了)HttpRequest Object
(0) UNINITIALIZED
未初始化 The object has been created but not initialized. (The open method has not been called.)
(xml(标准化越来越近了)HttpRequest)对象已经创建,但尚未初始化(还没有调用open方法)。
(1) LOADING
载入 The object has been created, but the send method has not been called.
(xml(标准化越来越近了)HttpRequest)对象已经创建,但尚未调用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)未初始化
此阶段确认xml(标准化越来越近了)HttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备。值为0表示对象已经存在,否则浏览器会报错--对象不存在。

(1)载入
此阶段对xml(标准化越来越近了)HttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。

(2)载入完成
此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。值为2表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。

(3)交互
此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responsexml(标准化越来越近了)属性存取的格式,为在客户端调用作好准备。状态3表示正在解析数据。

(4)完成
此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过xml(标准化越来越近了)HttpRequest对象的相应属性取得数据。

概而括之,整个xml(标准化越来越近了)HttpRequest对象的生命周期应该包含如下阶段:
创建-初始化请求-发送请求-接收数据-解析数据-完成

在具体应用中,明确了readyState的五个状态(xml(标准化越来越近了)HttpRequest对象的生命周期各个阶段)的含义,就可以消除对ajax(动态网站静态化)核心的神秘感(语焉不详的背后要么是故弄玄虚,制造神秘感;要么就是“以其昏昏,使人昭昭”),迅速把握其实质,对减少学习中的挫折感和增强自信心都极其有益。

比如,通过如下示例:

//声明数组

var states = [“正在初始化……”,

“正在初始化请求……成功!

正在发送请求……”,

“成功!

正在接收数据……”,

“完成!

正在解析数据……”,

“完成!

”];
//回调函数内部代码片段

if (xml(标准化越来越近了)Http.readyState==4)

{

var span = document.createElement(“span”);

span.innerHTML = states[xml(标准化越来越近了)Http.readyState];

document.body.appendChild(span);
if (xml(标准化越来越近了)Http.status == 200)

{

var xml(标准化越来越近了)doc = xml(标准化越来越近了)Http.responsexml(标准化越来越近了);

//其他代码

}
//别忘记销毁,防止内存泄漏

xml(标准化越来越近了)Http = null;

}else{

var span = document.createElement(“span”);

span.innerHTML = states[xml(标准化越来越近了)Http.readyState];

document.body.appendChild(span);

}结果如下:
正在初始化请求……成功!

正在发送请求……成功!

正在接收数据……完成!

正在解析数据……完成!

我们很容易明白xml(标准化越来越近了)HttpRequest对象在各个阶段都在做什么。因此,也就很容易对ajax(动态网站静态化)的核心部分有一个真正简单明了的理解。
Javascript 相关文章推荐
Jqyery中同等与js中windows.onload的应用
May 10 Javascript
解决遍历时Array.indexOf产生的性能问题
Jul 03 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
Sep 02 Javascript
JavaScript监听和禁用浏览器回车事件实例
Jan 31 Javascript
jQuery实现DIV层淡入淡出拖动特效的方法
Feb 13 Javascript
JavaScript 数组的深度复制解析
Nov 02 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
Dec 24 Javascript
vue中keep-alive的用法及问题描述
May 15 Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
Oct 15 Javascript
jQuery带控制按钮轮播图插件
Jul 31 jQuery
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
jquery操作HTML5 的data-*的用法实例分享
Aug 17 #Javascript
js判断浏览器是否支持html5
Aug 17 #Javascript
一段非常简单的js判断浏览器的内核
Aug 17 #Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
Aug 16 #Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
Aug 16 #Javascript
Node.js安装教程和NPM包管理器使用详解
Aug 16 #Javascript
Node.js中的事件驱动编程详解
Aug 16 #Javascript
You might like
一个php作的文本留言本的例子(四)
2006/10/09 PHP
社区(php&&mysql)五
2006/10/09 PHP
php操作mysql数据库的基本类代码
2014/02/25 PHP
PHP在线打包下载功能示例
2016/10/15 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
PHP7 错误处理机制修改
2021/03/09 PHP
jquery实现的可隐藏重现的靠边悬浮层实例代码
2013/05/27 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
webpack 从指定入口文件中提取公共文件的方法
2018/11/13 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
Python开发编码规范
2006/09/08 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
Python验证码识别的方法
2015/07/10 Python
Python文件的读写和异常代码示例
2017/10/31 Python
R语言 vs Python对比:数据分析哪家强?
2017/11/17 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
Python QQBot库的QQ聊天机器人
2019/06/19 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
python实现快递价格查询系统
2020/03/03 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
拾金不昧表扬信范文
2014/01/11 职场文书
党校培训自我鉴定
2014/02/01 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
2015年工程部工作总结
2015/04/30 职场文书
小学见习报告
2015/06/23 职场文书
python 如何将两个实数矩阵合并为一个复数矩阵
2021/05/19 Python
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript