• 探讨Ajax中有关readyState(状态值)和status(状态码)的问题


    先看下面一段代码,然后给大家详细介绍,Ajax中有关readyState(状态值)和status(状态码)的问题,具体内容如下所示:

    var getXmlHttpRequest = function () {
    try{
    //主流浏览器提供了XMLHttpRequest对象
    return new XMLHttpRequest();
    }catch(e){
    //低版本的IE浏览器没有提供XMLHttpRequest对象,IE6以下
    //所以必须使用IE浏览器的特定实现ActiveXObject
    return new ActiveXObject("Microsoft.XMLHTTP");
    }
    };
    var xhr = getXmlHttpRequest();
    // readyState 0=>初始化 1=>载入 2=>载入完成 3=>解析 4=>完成
    // console.log(xhr.readyState); 0
    xhr.open("TYPE", "URL", true);
    // console.log(xhr.readyState); 1
    xhr.send();
    // console.log(xhr.readyState); 1
    xhr.onreadystatechange = function () {
    // console.log(xhr.status); //HTTP状态吗
    // console.log(xhr.readyState); 2 3 4
    if(xhr.readyState === 4 && xhr.status === 200){
    alert(xhr.responseText);
    }
    };

    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(状态码)的问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 相关阅读:
    人月神话阅读笔记之一
    第一阶段冲刺站立会议报告——9
    第一阶段冲刺站立会议报告——8
    第一阶段冲刺站立会议报告——7
    第一阶段冲刺站立会议报告——6
    第一阶段冲刺站立会议报告——5
    第二阶段冲刺第一天
    寻找水王2
    构建之法阅读笔记05
    第十二周学习进度条
  • 原文地址:https://www.cnblogs.com/xiaocaiyuxiaoniao/p/8213889.html
Copyright © 2020-2023  润新知