关于XMLHttpRequest状态的讨论及处理方法
今天主要是讨论下XMLHttpRequest的响应状态问题。我们知道,XMLHttpRequest的响应阶段有5个,分别是:
- 请求未初始化
- 服务器连接已建立
- 请求已接收
- 请求处理中
- 请求已完成,且响应已就绪
我们是通过onreadystatechange来进行判断的,我们可以得到的状态只有4个。就是从服务器链接已建立到请求完成。昨天也搜索了下网络,对这个状态的分析并不是很多,奶牛自己测试了下,分享下。
首先,正常情况下,我们可以得到4个阶段的情况,一个成功的请求并得到响应的readyState及status如下:
- readyState:1 status:0
- readyState:2 status:200
- readyState:3 status:200
- readyState:4 status:200
也就是说,当请求到达“请求已接收”阶段的时候就已经反馈回来了http status,就是我们看到的200,这个是正常的状态。
我们来设想这样一种情景:我们请求交互的服务器与我们的网络并不连通,或者说目标服务器已经下线、服务器无响应,会是种什么状态呢?应该如何处理呢?这是不是响应超时呢?我们来测试下:
- readyState:1 status:0
- POST http://127.0.0.1/upload
- readyState:2 status:0
- readyState:4 status:0
通过结果我们可以看出,我们的请求已经发出,但是由于服务器对接收到的请求并没有应答,因此我们并没有得到服务器的响应状态,并且服务器的处理状态我们也不得而知,也就是为什么没有readyState3的原因,而在readyState4的阶段,我们得到的status是0,这也就是我们需要来处理的状态,即readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0),这个状态我们应该归结为error、abort、timeout还是其它呢?
奶牛把它分类到其它里面,处理方法在onreadystatechange里面处理。
- xhr.onreadystatechange = function() {
- console.log("readyState:"+xhr.readyState+" status:"+xhr.status);
- if (xhr.readyState == 4 && xhr.status == 200) {
- console.log("Request successful!");};
- if(xhr.readyState == 4 && xhr.status == 0){
- console.log("No response from server!");
- };
- };
对于服务器无应答无响应或者错误状态的处理方法都应放在onreadystatechange,http status有很多,可参考http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
在XMLHttpRequest Level 2里面有新增加一个timeout的设置及处理方法,超时是指request请求并没有在规定的时间内完成的一种情况,设置方法如下:
- xhr.timeout = 3000;
- xhr.ontimeout = function(event){
- alert('time out !');
- }
这样子,如果在3秒内交互未完成,则提示超时并终止,我们假设一种极端的情况,既在1ms内服务器未能完成请求,这种状态很容易得到,我们来看下反馈信息
- readyState:1 status:0
- POST http://127.0.0.1/upload
- readyState:4 status:0
当然,在非极端的情况下,也就是说在变化阶段2、3的时候如果超时,则readyState == 4的时候也有 status ==0 ,所以,我们可以把超时归结到readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0)的状态,但是并不能把readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0)的状态说是超时,因为超时是在服务器有反馈的时候才有效的,即在readyState ==2 时候status有具体响应值的时候,所以readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0)的状态是包含超时状态的。
而对于readyState == 4 && status == 0(xhr.readyState == 4 && xhr.status == 0)的状态可以用上文中的方法进行处理。
关于XMLHttpRequest状态的讨论及处理方法的更多相关文章
- XMLHttpRequest状态码及相关事件
1.创建一个XMLHttpRequest对象 2.对XMLHttpRequest对象进行事件的监听(定义监听事件的位置不影响 3.对XMLHttpRequest对象的状态码 状态 名称 描述 0 ...
- js进阶 14-2 如何用ajax验证登陆状态(这里用load方法)
js进阶 14-2 如何用ajax验证登陆状态(这里用load方法) 一.总结 一句话总结:$('#test').load('test.php?password=1234560'),这样就get方式提 ...
- java基础知识回顾之java Thread类学习(十)--线程的状态以及转化使用的方法介绍
线程的概述: 线程是程序的多个执行路径,执行调度的单位,依托于进程存在.线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间叫做线程栈,是建立线程的时候由系 ...
- AJAX(XMLHttpRequest)进行跨域请求方法详解
AJAX(XMLHttpRequest)进行跨域请求方法详解(三) 2010年01月11日 08:48:00 阅读数:24213 注意:以下代码请在Firefox 3.5.Chrome 3.0.Saf ...
- 01-书城http状态405-此url不支持http方法get
错误: http状态405-此url不支持http方法get 原因:
- TortoiseSVN文件夹及文件状态图标不显示解决方法
win8 64位系统,原本svn是好用的,安装了klive金山快盘后,svn图标都不显示了.最后通过修改注册表解决: win+R调出运行框,输入regedit,打开注册表编辑器. HKEY_LOCAL ...
- umount nfs状态为busy的处理方法
umountall状态为busy的系统: 以下四种情况,文件系统都会显示:umount: file_system_name busy 1 A program is accessing a file o ...
- CLOSE_WAIT状态的原因与解决方法 --转
转自:http://blog.chinaunix.net/uid-20357359-id-1963662.html 这个问题之前没有怎么留意过,是最近在面试过程中遇到的一个问题,面了两家公司,两家公司 ...
- MongoDB的upsert状态判断和pymongo使用方法
在mongo中,有一个命令非常的方便,就是upsert,顾名思义就是update+insert的作用 根据条件判断有无记录,有的话就更新记录,没有的话就插入一条记录 upsert的使用方法: Mong ...
随机推荐
- 【学习笔记 边分树】【uoj400】【CTSC2018】暴力写挂
题目 描述 有两棵树\(T\)和\(T'\),节点个数都为\(n\),根节点都为\(1\)号节点; 求两两点之间 $$ \begin{align} depth(x) + depth(y) - ...
- ACCESS与SQL Server下SQL Like 查询的不同
在ACCESS中LIKE的用法Access里like的通配符用法是这样: “?”表示任何单一字符: “*”表示零个或多个字符: “#”表示任何一个数字 所以应该是: select * from dat ...
- 关于navicat远程连接mysql问题
如果你想连接你的mysql的时候发生这个错误: ERROR 1130: Host '192.168.1.81' is not allowed to connect to this MySQL serv ...
- springboot整合freemarker
前后端分离现在越来越多,如何有效的使用springboot来整合我们的页面是一个很重要的问题. springboot整合freemarker有以下几个步骤,也总结下我所犯的错误: 1.加依赖: 2.配 ...
- CentOS 7 系统的初化始配置
安装好CentOS7系统后我们要进行初始设置来让我们的服务器方便管理与使用,但是发现在7以前的版本都能输入的命令不能输入了,去官网查查才发发生了很大的变化,关于有哪些变化的可以点击这里查看,初始配置的 ...
- 二进制手动部署kubernetes 1.10.10
转载于:https://www.jevic.cn/2018/09/23/kuberentes-1.10.10/?tdsourcetag=s_pcqq_aiomsg#heapster 通读一遍在实际操作 ...
- 不跳转修改url(history.pushState)
有时候我们会想不跳转的情况下修改url 直接上代码吧: history.pushState(null,"","?test=123") 值得注意的是,为了用户安全 ...
- js动画最佳实现——requestAnimationFrame
我们经常用setInterval来实现动画,其实这种做法不是太好,因为不同浏览器的刷新频率也不一样(一般认为设置16为最佳,按每秒60帧算,1000/60≍16.67) var dis = 0,tim ...
- P4315 月下“毛景树”
P4315 月下"毛景树" 题目描述 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里. 爬啊爬~爬啊爬 ...
- GBDT用于分类问题
一.简介 GBDT在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一,在前几年深度学习还没有大行其道之前,gbdt在各种竞赛是大放异彩.原因大概有几个 一:效果确实挺不错. 二:既可以用于分类 ...