欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JS的JSON二个API、传统异步、现代异步Fetch及异步中使用 async, await的小结

程序员文章站 2022-03-06 13:12:53
...

1. 演示JSON的二个API

  • json是通用的,数据交互格式,用于前后端数据通信。
  • json独立于编程语言,本质是一个格式化字符串。
  • json借用了js对象字面量的语法,简洁高效,已替代了传统的xml格式
  • json不是js对象, 但它可以与js对象之间(用函数)相互转换
  • json: 本质就是js对象的序列化, 即js的对象表示格式,只是转为字符串表示
    例如php后端生成json字符串,前端js转换为对象,实现前后端交换数据
  • json字符串格式:
    — 所有属性必须使用双引号
    — 字符类型的值必须使用双引号
    — 不能有undefined
    — 最后一个值后不能有逗号
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>JSON的二个API</title>
  8. </head>
  9. <body>
  10. <script>
  11. // 定义对象
  12. const user = {
  13. id: 001,
  14. name: "李小龙",
  15. nationality: "中国",
  16. gender: "male",
  17. };
  18. console.log(user);
  19. // 显示为对象
  20. // 将对象转为json字符串
  21. let jsonUser = JSON.stringify(user);
  22. console.log(jsonUser);
  23. // 显示字符串:{"id":1,"name":"李小龙","nationality":"中国"}
  24. // 第2个参数为数组时,只把相应的属性转为json字符串
  25. jsonUser = JSON.stringify(user, ["name", "nationality"]);
  26. console.log(jsonUser);
  27. // 显示结果:{"name":"李小龙","nationality":"中国"}
  28. // 第2个参数为回调函数时,传递对象索引和值
  29. jsonUser = JSON.stringify(user, (key, value) => {
  30. // 根据属性判断分支
  31. switch (key) {
  32. // 根据性别转为中文
  33. case "gender":
  34. return value === "male" ? "男" : "女";
  35. // 不输出国籍
  36. case "nationality":
  37. return undefined;
  38. case "id":
  39. return undefined;
  40. // 其他属性都输出
  41. default:
  42. return value;
  43. }
  44. });
  45. console.log(jsonUser);
  46. // 显示字符串:{"name":"李小龙","gender":"男"}
  47. // 第3个参数:格式化
  48. jsonUser = JSON.stringify(user, null, 2);
  49. console.log(jsonUser);
  50. // 显示结果为分行缩进格式显示对象属性
  51. jsonUser = JSON.stringify(user, null, "...");
  52. console.log(jsonUser);
  53. // 定义json字符串
  54. const jsonUS_TV = `
  55. {
  56. "moveTitle":"时空之轮",
  57. "years":"2021",
  58. "country":"美国",
  59. "language":"英语",
  60. "category":["动作","冒险","剧情","奇幻"]
  61. }
  62. `;
  63. // 转为js对象
  64. let classUS_TV = JSON.parse(jsonUS_TV);
  65. console.log(classUS_TV);
  66. // 显示结果为对象
  67. // 使用参数
  68. classUS_TV = JSON.parse(jsonUS_TV, (key, value) => {
  69. // 删除years属性
  70. if (key === "years") {
  71. delete this[key];
  72. } else {
  73. return value;
  74. }
  75. });
  76. console.log(classUS_TV);
  77. // 显示到页面中
  78. let html = `
  79. <h3>美剧推荐</h3>
  80. <p>片名:${classUS_TV.moveTitle}</p>
  81. <p>国家:${classUS_TV.country}</p>
  82. <p>语言:${classUS_TV.language}</p>
  83. <p>类型:${Object.values(classUS_TV.category)
  84. .map((value) => `${value}`)
  85. .join(",")}</p>
  86. `;
  87. const div = document.createElement("div");
  88. div.innerHTML = html;
  89. document.body.append(div);
  90. </script>
  91. </body>
  92. </html>

2. 异步传统方式

  • 创建对象: new XMLHttpRequest();
  • 响应类型: xhr.responseType = “json”;设置为返回数据类型为json
  • 配置参数: xhr.open(“GET”, url, true);
  • 请求回调: xhr.onload = () => console.log(xhr.response);
  • 失败回调: xhr.onerror = () => console.log(“Error”);
  • 发起请求: xhr.send(null);
  • xhr 至少监听2个事件: load,error, 调用2个函数: open,send
  • post请求,需要设置一下请求头与请求的数据,其它与get请求完全相同
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>异步</title>
  8. </head>
  9. <body>
  10. <button onclick="getUserXHR(this)">查询用户信息--传统方式</button>
  11. </body>
  12. <script>
  13. // 请求链接,没有参数显示所有数据
  14. let url = "user.php";
  15. // 有参数显示单条数据
  16. url = "user.php?id=2";
  17. // 一、传统异步方式
  18. function getUserXHR(btn) {
  19. // 1. 创建异步对象
  20. const XHR = new XMLHttpRequest();
  21. // 2. 响应类型为json
  22. XHR.responseType = "json";
  23. // 3. 配置参数
  24. XHR.open("GET", url, true);
  25. // 4. 请求响应成功结果,onload方法参数为函数,不用参数
  26. // 返回结果在response对象中
  27. XHR.onload = () => {
  28. console.log(XHR.response);
  29. // 调用自定义函数显示在页面
  30. render(XHR.response, btn);
  31. };
  32. // 5. 请求失败处理
  33. XHR.onerror = () => console.log("请求错误!");
  34. // 6. 发起请求
  35. XHR.send(null);
  36. }
  37. </script>
  38. <script src="function.js"></script>
  39. </html>

3. 异步现代Fetch方式

  • 语法

    1. fetch(请求链接)
    2. .then(参数=>{}) 请求成功,参数为回调函数,返回值
    3. .then(...) 链式调用
    4. .catch(...) 请求失败,参数为回调函数,错误信息
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>Fetch异步</title>
  8. </head>
  9. <body>
  10. <button onclick="getUser(this)">查询用户信息--Fetch方式</button>
  11. </body>
  12. <script>
  13. // 请求链接,没有参数显示所有数据
  14. let url = "user.php";
  15. // 有参数显示单条数据
  16. // url = "user.php?id=1";
  17. function getUser(btn) {
  18. fetch(url)
  19. // 取得返回结果,转为json对象
  20. .then((res) => res.json())
  21. // 链式调用,将json对象输出
  22. .then((js) => {
  23. console.log(js);
  24. // 调用自定义函数,在页面中显示
  25. render(js, btn);
  26. })
  27. .catch((err) => console.log("查询错误:", err));
  28. }
  29. </script>
  30. <script src="function.js"></script>
  31. </html>

4. 异步中使用 async, await

ECMA2017, 使用async, await, 来简化了fetch , 实现同步的方式来编写异步代码

  • 在异步代码前加await,表示执行异步,要等待结果
  • 函数中有await表示是异步函数,在函数前面加async表示
    使用 async, await可把异步按同步运行,代码从前往后一条条运行。
    以后常用这种方式使用异步
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>async, await</title>
  8. </head>
  9. <body>
  10. <button onclick="getUser(this)">查询用户信息--Fetch方式</button>
  11. </body>
  12. <script>
  13. // 请求链接
  14. let url = "http://jsonplaceholder.typicode.com/users";
  15. // 函数中有await异步操作,则函数要用async表示异步函数
  16. async function getUser(btn) {
  17. // 定义常量RESPONSE,赋值为响应对象
  18. // fetch为异步运行,在前面用await表示,要等待响应结果
  19. const RESPONSE = await fetch(url);
  20. // 上面对象是json字符串,转为对象。也是异步,要等待转换结果
  21. const RESULT = await RESPONSE.json();
  22. // 调用自定义函数,在页面上显示结果
  23. render(RESULT, btn);
  24. }
  25. </script>
  26. <script src="function.js"></script>
  27. </html>