博客列表 >异步与模块

异步与模块

OC的PHP大牛之路
OC的PHP大牛之路原创
2022年08月04日 18:18:04337浏览

异步

同步: 顺序执行, 优点: 静态预判结果可控, 缺点: 耗时任务阻塞执行
异步: 乱序执行, 优点: 不会阻塞代码,体验好, 缺点: 顺序不可控

异步任务(耗时)

  1. 定时任务: setTimeout, setInterval
  2. 事件监听: addEventListener
  3. 网络请求: ajax, promise,fetch
  4. 文件读写等涉及IO的操作

ajax-xhr

传统方式,信息会在新页面中或者弹窗中查看,用户体验不好
Ajax: 局部更新,用户不需要离开当前页面就可以看到新内容, 单页面应用SPA

传统 XHR

  1. 1. 创建对象: new XMLHttpRequest();
  2. 2. 响应类型: xhr.responseType = "json";
  3. 3. 配置参数: xhr.open("GET", url, true);
  4. 4. 请求回调: xhr.onload = () => console.log(xhr.response);
  5. 5. 失败回调: xhr.onerror = () => console.log("Error");
  6. 6. 发起请求: xhr.send(null);

xhr 至少监听2个事件: load,error, 调用2个函数: open,send
post请求,需要设置一下请求头与请求的数据,其它与get请求完全相同

  1. function getUser1(btn) {
  2. //1. 创建对象
  3. const xhr = new XMLHttpRequest();
  4. //2. 响应类型
  5. xhr.responseType = 'json';
  6. //3. 配置参数
  7. // 不传get参数,默认返回全部用户, 用table显示
  8. let url = 'http://website.io/users.php';
  9. // 如果有get参数,用户id,用ul列表显示
  10. url = 'http://website.io/users.php?id=1';
  11. xhr.open('GET', url);
  12. //4. 请求回调
  13. xhr.onload = () => {
  14. console.log(xhr.response);
  15. // 将数组渲染到页面中
  16. render(xhr.response, btn);
  17. };
  18. //5. 失败回调
  19. xhr.onerror = () => console.log('Error');
  20. //6. 发起请求
  21. xhr.send(null);
  22. }

fetch

  1. fetch(url)
  2. .then(res)
  3. .then(...)
  4. .catch(err)
  1. function getUser2(btn) {
  2. let url = 'http://website.io/users.php';
  3. // fetch的所有操作都是异步的,但是通过then使用顺序可控
  4. fetch(url)
  5. .then(function (response) {
  6. return response.json();
  7. })
  8. .then(function (json) {
  9. // 控制台
  10. console.log(json);
  11. // 将数组渲染到页面中
  12. render(json, btn);
  13. });
  14. }

JS模块

  1. 模块就是一个js文档
  2. 模块有自己的独立作用域(全局,函数,块)
  3. 模块内成员,默认全部私有,只有导出后才可以被外部使用

模块成员导出与导入

  1. <script type="module">
  2. // js中, 所有代码共用一个全局作用域: window
  3. // 导入模块
  4. import { username, hello } from './modules/m1.js';
  5. console.log(username);
  6. console.log(hello(username));
  7. </script>

默认导出

  1. <script type="module">
  2. // 导入模块的默认成员不要用对象字面量,用标识符
  3. // 只要不用对象字面量接收模块成员,就是默认导出
  4. import User from './modules/m3.js';
  5. console.log(typeof User);
  6. const user = new User('王老师');
  7. console.log(user.username);
  8. console.log(user.getUsername(user.username));
  9. </script>

混合导出

  1. <script type="module">
  2. // 接收混合导入成员,默认成员的命名,必须放在非默认的前面
  3. // import useremail, { username, hello } from './modules/m4.js';
  4. // 默认导出成员,在导入时可以随意命名的,useremail只是巧合
  5. import email, { username, hello } from './modules/m4.js';
  6. // console.log(useremail);
  7. console.log(email);
  8. console.log(hello(username));
  9. </script>

命名空间

  1. <script type="module">
  2. // 导入的成员,过多时,使用{...}会很长的
  3. // 可以将所有的导入成员,全部挂载到一个对象上
  4. // 此时, 导入模块的成员,自动成为该对象上的属性
  5. // 这个对象就是: 命名空间
  6. // import email, { username, hello } from './modules/m4.js';
  7. import * as user from './modules/m4.js';
  8. console.log(user);
  9. // 此时,访问模块成员时, 必须添加空间前缀,其实就是user对象
  10. console.log(user.username);
  11. console.log(user.hello(user.username));
  12. // 访问默认
  13. console.log(user.default);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议