阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

原生js XMLhttprequest请求onreadystatechange执行两次的解决方法

277次阅读
没有评论

共计 2235 个字符,预计需要花费 6 分钟才能阅读完成。

导读 这篇文章主要介绍了原生 js XMLhttprequest 请求 onreadystatechange 执行两次的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
原生 js XMLhttprequest 请求 onreadychange 执行两次

最近做到一个页面需要兼容 IE,然后就写了一个原生 XMLhttprequest 请求

直接上错误代码

xmlHttp = new XMLHttpRequest();
        xmlHttp.open("post","https://baidu.com/mianxiang/baidu/biancheng");
        xmlHttp.setRequestHeader("Content-Type","application/json");
        xmlHttp.send(XXXXXXXXXX) ;
        xmlHttp.onreadystatechange = function () {if(this.status==200){console.log("responseText",this.responseText);
            }
        };

在上面代码中,当 status == 200 的 console.log 内容每次请求,都会在控制台打印两次,也就是说里面的逻辑会被执行两次,百度了很多都没有发现相似问题,和具体解决办法。

xmlHttp = new XMLHttpRequest();
        xmlHttp.open("post","https://baidu.com/mianxiang/baidu/biancheng");
        xmlHttp.setRequestHeader("Content-Type","application/json");
        xmlHttp.send(XXXXXXXXXX) ;
        xmlHttp.onreadystatechange = function () {if(xmlHttp.readyState == 4 && this.status==200){console.log("responseText",this.responseText);
            }
        };

最后偶然发现了和正确代码的差距,补上“xmlHttp.readyState == 4”

执行一次,问题解决。

分析,可能是因为在没有添加判断 readyState 时,当 options 预请求执行时,也会有一次状态码 200 的,所以会被执行两次,但是疑惑点是预请求不会返回数据,但是在打印时,两次打印都是有数据的。

查资料 + 请教大佬 = get 知识

知识:

  • 创建 xmlhttprequest 对象之后没有调用 open 之前 readystate 值为 0,调用 open()之后就变为 1 了,并且此时 onreadystatechange 函数与 open()几乎是同时执行的。
  • 在之后调用 send 方法之后,在 startHttpRequest 函数中 readystate 值仍为 1,而调用 send 方法之后应该有 2,3,4 三个状态,而只有在 startHttpRequest 函数用 alert 语句才可以观察到 3 个值!
  • 这是为什么呢?这是因为在 startHttpRequest 函数中当解析到 send 这一句时,并没有真正开始执行 send 执行。
  • 只有 send 执行,才可以在 onreadystatechange 函数观察到状态值的变化。
  • readystate 不是发送的状态,它是准备发送的状态,要把它想像成“人间大炮一级准备、二级准备、放”这样的口号,不是请求发送本身。
  • 同时 xmlhttp 也不是监听服务器信息,它是在 send 的时候获取服务器返回的状态信息而已,只有一次,监听则是一直在观察状态。
  • 关于 readyState 不同状态总结
    (0) 未初始化

    此阶段确认 XMLHttpRequest 对象是否创建,并为调用 open()方法进行未初始化作好准备。

    值为 0 表示对象已经存在,否则浏览器会报错--对象不存在。

    (1) 载入

    此阶段对 XMLHttpRequest 对象进行初始化,即调用 open()方法,根据参数 (method,url,true) 完成对象状态的设置。

    并调用 send()方法开始向服务端发送请求。值为 1 表示正在向服务端发送请求。

    (2) 载入完成

    此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。

    值为 2 表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。

    (3) 交互

    此阶段解析接收到的服务器端响应数据。

    即根据服务器端响应头部返回的 MIME 类型把数据转换成能通过 responseBody、responseText 或 responseXML 属性存取的格式,为在客户端调用作好准备。

    状态 3 表示正在解析数据。

    (4) 完成

    此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。

    值为 4 表示数据解析完毕,可以通过 XMLHttpRequest 对象的相应属性取得数据。

    这个时候再回顾之前为何执行两次 onreadystatechange,因为当 state 每次变化的时候都会执行到 onreadystatechange,其实是 readyState 每次变化都会有执行 onreadystatechange,因为我判断了 this.status == 200,所以当服务器响应了之后返回了 200 的状态码,才会执行 console.log(),才有上面的执行两次的问题。

    至此问题解决!!!

    阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

    腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

    代金券:在阿里云专用满减优惠券

    正文完
    星哥玩云-微信公众号
    post-qrcode
     0
    星锅
    版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计2235字。
    转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
    【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
    阿里云-最新活动爆款每日限量供应
    评论(没有评论)
    验证码
    【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

    星哥玩云

    星哥玩云
    星哥玩云
    分享互联网知识
    用户数
    4
    文章数
    19348
    评论数
    4
    阅读量
    7800550
    文章搜索
    热门文章
    开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

    开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

    开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
    星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

    星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

    星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
    云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

    云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

    云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
    我把用了20年的360安全卫士卸载了

    我把用了20年的360安全卫士卸载了

    我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
    星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

    星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

    星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
    阿里云CDN
    阿里云CDN-提高用户访问的响应速度和成功率
    随机文章
    我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

    我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

    我用 AI 做了一个 1978 年至 2019 年中国大陆企业注册的查询网站 最近星哥在 GitHub 上偶然...
    12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

    12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

    12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换...
    让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

    让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

    让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
    星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

    星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

    星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
    浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

    浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

    浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...

    免费图片视频管理工具让灵感库告别混乱

    一言一句话
    -「
    手气不错
    你的云服务器到底有多强?宝塔跑分告诉你

    你的云服务器到底有多强?宝塔跑分告诉你

    你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...
    星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

    星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

      星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
    星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

    星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

    星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
    星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

    星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

    星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
    把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

    把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

    把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...