1.Ajax:readyState(状态值)和status(状态码)的区别

readyState,是指运行AJAX所经历过的几种状态,无论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤,使用“ajax.readyState”获得

status,是指无论AJAX访问是否成功,由HTTP协议根据所提交的信息,服务器所返回的HTTP头信息代码,使用“ajax.status”获得

总体理解:可以简单的理解为state代表一个整体的状态。而status是这个大的state下面具体的小的状态。

2.什么是readyState

readyState是XMLHttpRequest对象的一个属性,用来标识当前XMLHttpRequest对象处于什么状态。
readyState总共有5个状态值,分别为0~4,每个值代表了不同的含义


0 - (未初始化)

(XMLHttpRequest)对象已经创建,但还没有调用open()方法。值为0表示对象已经存在,否则浏览器会报错:对象不存在。

1 - (载入/正在发送请求)

对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true),完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。

2 - (载入完成/数据接收)

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

3 - (交互/解析数据)正在解析响应内容

此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responseXML属性存取的格式,为在客户端调用作好准备。值为3表示正在解析数据。

4 - (后台处理完成)响应内容解析完成,可以在客户端调用了

此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过XMLHttpRequest对象的相应属性取得数据。

从时间顺序来看:

3.什么是status

status是XMLHttpRequest对象的一个属性,表示响应的HTTP状态码

在HTTP1.1协议下,HTTP状态码总共可分为5大类

1xx:信息响应类,表示接收到请求并且继续处理
2xx:处理成功响应类,表示动作被成功接收、理解和接受
3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正确执行一个正确的请求100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到
301——删除请求数据
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除
400——错误请求,如语法错误
401——请求授权失败
402——保留有效ChargeTo头响应
403——请求不允许
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求
500——服务器产生内部错误
501——服务器不支持请求的函数
502——服务器暂时不可用,有时是为了防止发生系统过载
503——服务器过载或暂停维修
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
505——服务器不支持或拒绝支请求头中指定的HTTP版本

4.思考问题:为什么onreadystatechange的函数实现要同时判断readyState和status呢?

第一种思考方式:只使用readyState

var getXmlHttpRequest = function () {if (window.XMLHttpRequest) {return new XMLHttpRequest();}else if (window.ActiveXObject) {return new ActiveXObject("Microsoft.XMLHTTP");}
};
var xhr = getXmlHttpRequest();
xhr.open("get", "1.txt", true);
xhr.send();
xhr.onreadystatechange = function () {if (xhr.readyState === 4) {alert(xhr.responseText);}
};

服务响应出错了,但还是返回了信息,这并不是我们想要的结果
如果返回不是200,而是404或者500,由于只使用readystate做判断,它不理会放回的结果是200、404还是500,只要响应成功返回了,就执行接下来的javascript代码,结果将造成各种不可预料的错误。所以只使用readyState判断是行不通的。

第二种思考方式:只使用status判断

var getXmlHttpRequest = function () {try{return new XMLHttpRequest();}catch(e){return new ActiveXObject("Microsoft.XMLHTTP");};
};
var xhr = getXmlHttpRequest();
xhr.open("get", "1.txt", true);
xhr.send();
xhr.onreadystatechange = function () {if (xhr.status === 200) {alert("readyState=" + xhr.readyState + xhr.responseText);}
}

事实上,结果却不像预期那样。响应码确实是返回了200,但是总共弹出了3次窗口!第一次是“readyState=2”的窗口,第二次是“readyState=3”的窗口,第三次是“readyState=4”的窗口。由此,可见onreadystatechange函数的执行不是只在readyState变为4的时候触发的,而是readyState(2、3、4)的每次变化都会触发,所以就出现了前面说的那种情况。可见,单独使用status判断也是行不通的。

5.由上面的试验,我们可以知道判断的时候readyState和status缺一不可。那么readyState和status的先后判断顺序会不会有影响呢?

我们可以将status调到前面先判断,代码如 xhr.status === 200 && xhr.readyState === 4
事实上,这对于最终的结果是没有影响的,但是中间的性能就不同了。由试验我们知道,readyState的每次变化都会触发onreadystatechange函数,假如先判断status,那么每次都会多判断一次status的状态。虽然性能上影响甚微,不过还是应该抱着追求极致代码的想法,把readyState的判断放在前面。
xhr.readyState === 4 && xhr.status === 200

Ajax关于readyState和status相关推荐

  1. webApi前端ajax调用后端返回{“readyState“:0,“status“:0,“statusText“:“error“}解决方案

    webApi前端ajax调用后端返回{"readyState":0,"status":0,"statusText":"error& ...

  2. 【ajax】readyState=4并且status=200时,还进error方法

    转载自  [ajax]readyState=4并且status=200时,还进error方法 今天在使用jquery.ajax方法去调用后台方法时,ajax中得参数data类型是"JSON& ...

  3. IOS 10 微信 ajax readystate=0 status=0 解决方法

    IOS 10 微信 ajax readystate=0 status=0 解决方法 参考文章: (1)IOS 10 微信 ajax readystate=0 status=0 解决方法 (2)http ...

  4. AJAX(二)ResponseText、onreadystatechange 事件、readyState、status、ASP和PHP、数据库实例、XML实例

    AJAX(二)ResponseText.onreadystatechange 事件.readyState.status.ASP和PHP.数据库实例.XML实例 文章目录 AJAX(二)Response ...

  5. ajax对象状态0,ajax返回readyState为0?

    请求ajax报错, XMLHttpRequest对象返回readyState:0, status:0 相关代码 function login(){ var phone = '18600000000'; ...

  6. Servlet 与 Ajax 交互一直报status=parsererror

    Servlet 与 Ajax 交互一直报status=parsererror   原因:servlet 返回的数据不是 Json 格式   1.JS代码为: 1 var jsonStr = {'clu ...

  7. ajax status php,解决laravel 出现ajax请求419(unknown status)的问题

    如下所示: 这个是因为laravel自带csrf验证的问题 解决方法 方法一:去关掉laravel的csrf验证,但这个人不建议,方法也不写出来了. 方法二:把该接口写到api.php上就好了 方法三 ...

  8. ajax的readyState状态值和onreadystatechange事件,帮助你更好的理解ajax

    认识ajax的readyState状态值和onreadystatechange事件 1.readyState是什么? 2.readyState它有多少个值,分别代表什么? 3.认识ajax的onrea ...

  9. AJAX 状态值(readyState)与状态码(status)详解

    总结:status体现的是服务器对请求的反馈,而readystate表明客户端与客户的交互状态过程. 1- AJAX状态值与状态码区别AJAX状态值是指,运行AJAX所经历过的几种状态,无论访问是否成 ...

  10. AJAX问题之XMLHttpRequest status = 0

    其实这篇文章要写的不止是XMLHttpRequest status = 0 这个问题,还有我重新看AJAX遇到的一些问题和自己的反思. 先看整个例子: <html> <head> ...

最新文章

  1. [转] vuewebpack多页面配置
  2. linux 简单dns搭建,搭建一个简易的DNS服务
  3. bzoj1007[HNOI2008]水平可见直线
  4. OpenGL在frag着色器中模拟点光源
  5. 如何让tomcat只支持ipv4
  6. \pages\WxPay\WxPay.js
  7. 微信公众账号 token 验证失败 解决办法
  8. object转class_从零并发框架(三)异步转同步注解+字节码增强代理实现
  9. 《Python自动化》学习笔记:百度云智能实现黑白图片上色,人物动漫化(代码干货)
  10. intellij怎么找实现_学习播音主持配音之后,自己该怎么利用自己所学实现变现呢?...
  11. opensuse安装搜狗输入法
  12. 黑苹果hd3000显存3m_加装黑苹果生产力翻倍,E3 神机规模升级再战五年
  13. 前后端交互过程、常见软件架构、服务器分类
  14. c语言变量报存在bss段,浅谈c语言代码段 数据段 bss段
  15. HIT2020春软件构造lab1
  16. 设计模式 “之“ 责任链模式
  17. 锦标赛选择算法及 matlab 实现
  18. 华为发布云管理网络2.0,即日起免费试用
  19. springboot网上电子书店下载购买系统-图书商城网站961h3-java-ssm二级分类
  20. 洛谷P5594 [XR-4] 模拟赛C++ 思路加代码

热门文章

  1. Sklearn 中的可用数据集
  2. 联想Y470 非虚拟机安装苹果Mac OS X Mavericks 10.9.1教程详解(文字+图片),通俗易懂亲自动手——序列二之镜像写入,引导建立
  3. self paced learning(自步学习)
  4. GO中时间转换到毫秒
  5. Codeforces Round #476 (Div. 2) 题解
  6. mysql中ai是什么意思_MySQL explain用法
  7. matlab打开界面模糊,matlab模糊逻辑(一)
  8. php 判断非负整数,PHP-检测负数
  9. 机器学习笔记(八):强化学习
  10. caffe编译-CUDNN_STATUS错误解决方案