首页 > 其他分享 >关于 js ajax readyState 的阐述

关于 js ajax readyState 的阐述

时间:2023-10-19 12:45:07浏览次数:43  
标签:10 readyState console xhr js 响应 ajax

为了弄清楚 ajax readyState 的具体意义,做了如下测试:

index.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3   <head>
 4     <meta charset="UTF-8" />
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 6     <title>Document</title>
 7   </head>
 8   <body>
 9     <script>
10       const xhr = new XMLHttpRequest();
11 
12       console.log(xhr.readyState);
13 
14       xhr.open("POST", "http://localhost/a.json", true);
15 
16       console.log(xhr.readyState);
17 
18       xhr.onreadystatechange = function () {
19         if (xhr.readyState === 2) {
20           console.log(
21             2,
22             xhr.getAllResponseHeaders(),
23             xhr.responseText.slice(-10)
24           );
25         }
26         if (xhr.readyState === 3) {
27           console.log(3, xhr.responseText.slice(-10));
28         }
29         if (xhr.readyState === 4 && xhr.status === 200) {
30           console.log(4, xhr.responseText.slice(-10));
31         }
32       };
33       xhr.onerror = function (err) {
34         reject(err);
35       };
36       // 这里会触发预检请求,需要服务端做相关配置
37       // 或者使用 text/plain
38       xhr.setRequestHeader("Content-Type", "application/json");
39 
40       xhr.send(JSON.stringify({ step: 0 }));
41     </script>
42   </body>
43 </html>

server.js

 1 const http = require("http"); // node内部模块,用来创建http服务器
 2 
 3 const server = new http.Server();
 4 
 5 server.on("request", (req, res) => {
 6   res.writeHead(200, {
 7     "Content-Type": "text/plain",
 8     "Access-Control-Allow-Origin": "*",
 9     // 预检请求可以接受的请求头
10     "Access-Control-Allow-Headers": "Content-Type",
11     // 设置自定义响应头并暴露给浏览器 js
12     "define-none": "none",
13     "Access-Control-Expose-Headers": "define-none",
14   });
15 
16   req.on("data", (data) => data);
17 
18   req.on("end", () => {
19     // 预检请求不发送响应体
20     if (req.method === "OPTIONS") {
21       res.end();
22       return false;
23     }
24     res.write(
25       JSON.stringify(Array.from({ length: 10 ** 5 }).map((val, index) => index))
26     );
27     res.end();
28   });
29 });
30 
31 server.listen(80);

打印结果:

结论:xhr 初始化以后读取状态是 0;open 建立请求以后读取状态变更为 1,接下来的状态变更就可以用 onreadystatechange 监听了;send 发送请求以后等待服务端响应,接收到响应报文以后读取状态变更为 2,此时 js 可以拿到响应头,但是响应体是空字符串,说明浏览器没有拿到响应体或者没有完成响应体的解析;接下来读取状态变更为 3,在打印结果中可以看到 js 已经拿到了一小段响应体数据,当然如果传输数据量小的话也可以拿到完整的响应体;接下来读取状态变更为 4 的时候,js 可以拿到完整的响应体,所以通常我们在 readyState === 4 的时候对数据进行处理。

 

标签:10,readyState,console,xhr,js,响应,ajax
From: https://www.cnblogs.com/aurora-power/p/17774453.html

相关文章

  • xStream完美转换XML、JSON
    xStream框架xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换;前面有介绍过json-lib这个框架,在线博文:以及Jackson这个框架,在线博文:它们都完美支持JSON,但是对xml的支持还不是很好。一定程度上限制了对Java对象的描述,不能让xml......
  • js实现文件切片上传,断点续传
    断点续传:顾名思义,继续上次断开的点,继续上传。思路整理:拿到文件,对文件进行fingerprint=md5(file),得到文件指纹。将指纹保存服务器。切割文件,分段上传,每次上传一段。服务器根据指纹进行索引判断文件上传进度,直到文件的全部片段上传完毕。以下文字没有完整的代码,只有基础......
  • html+css3+anime.js实现线条来回滑动且渐隐动画
    效果: 代码:<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/><metaname="viewport"content="width=device-width,initial-sc......
  • vue2和vue3导出页面为PDF格式:jspdf和html2canvas
    一、vue2导出PDF使用步骤1、安装html2canvas,将页面html转换成图片npminstall--savehtml2canvas卸载:npmuninstallhtml2canvas指定版本安装:npminstall--savehtml2canvas@1.0.0-rc.42、安装jspdf,将图片生成pdfnpminstalljspdf--save3、定义全局函数在指......
  • jeecg中jsp页面合计问题
    问题:在一个tbody下,如何数量和价格,合计出单项的金额,同时在最下面合计出总金额 页面的jsp代码如下: <tableborder="0"cellpadding="2"cellspacing="0"id="bgLwg_table"><trbgcolor="#E6E6E6"><tdalign="center&......
  • html+css3+anime.js实现文字故障动画
    记录一个很酷的动画,效果如图: 是基于html+css3+anime.js实现的,看了眼代码,其实是默认文字的div中定位了几个相同的文字块,利用clip-path这个属性去裁剪展示其中的一部分,用于展示故障的效果,动画则是使用anime.js去循环改变X与Y轴的位置,同时调整绘制的颜色,demo代码如下:<!DOCTYPEh......
  • laravel:异常时返回json(10.27.0)
    一,相关文档:https://learnku.com/docs/laravel/10.x/errors/14857#87364d二,php代码:1,app\exceptions\Handler.php增加以下一段:1234567891011//重写renderpublicfunctionrender($request,Throwable$e){    if(env('APP_DEBUG')){  ......
  • Node.js中常用的设计模式有哪些?
    本文由葡萄城技术团队首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。设计模式简介设计模式是由经验丰富的程序员在日积月累中抽象出的用以解决通用问题的可复用解决方案,它提供了标准化的代码设计方案提升开发体验。Node.js作......
  • laravel:返回统一格式的json
    一,参考文档https://learnku.com/docs/laravel/10.x/responses/14850二,php代码1,App\extend\result\Result.php1234567891011121314151617181920212223242526272829303132333435<?php/*   统一格式的返回json数据*/na......
  • Ajax前后端交互实例
    什么是前后端联调?在我们开发的过程中,发送请求的ajax数据都不是后端返回的真数据,而是我们自己通过接口mock模拟的假数据,当前端的代码编写完成后,后端的接口也写好后,我们就需要把mock数据换点,尝试使用后端提供的数据,进行一个前后端的调试,我们会把这个过程叫做前后端接口联调。  ......