Blogger Information
Blog 46
fans 2
comment 0
visits 19467
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
1. xhr与fetch异步编程的步骤,实例演示 2. 模块成员导出与导入,别名使用场景与命名空间演示
P粉314265155
Original
433 people have browsed it

同步与异步

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  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. <!-- 定数器 -->
  11. <script>
  12. /**
  13. * (一): 同步与异步
  14. * 1. 同步: 顺序执行, 优点: 静态预判结果可控, 缺点: 耗时任务阻塞执行
  15. * 2. 异步: 乱序执行, 优点: 不会阻塞代码,体验好, 缺点: 顺序不可控
  16. *
  17. * 以银行排队办业务为例
  18. * 1. 同步: 默认排队叫号, 依次办理
  19. * 2. 异步: 耗时任务(如修改密码忘带身份证)则离开队列, 后面任务继续
  20. * 3. 任务队列: 取了身份证回来了, 就待在"任务队列"中等待再次叫号
  21. *
  22. * 哪些是异步任务(耗时)?
  23. * 1. 定时任务: setTimeout, setInterval
  24. * 2. 事件监听: addEventListener
  25. * 3. 网络请求: ajax, promise,fetch
  26. * 4. 文件读写等涉及IO的操作
  27. *
  28. * -----------------------------------------------------------------
  29. *
  30. * (二) 进程与线程
  31. * 1. 进程: 程序的运行状态, 执行实例
  32. * 2. 一个cpu同一时刻只能执行一个进程,通过上下文切换实现多任务,除非多核
  33. * 3. 线程: 进程中的某个任务,即一个进程,可以由多个线程完成
  34. * 4. js的特征,决定了它只能是单线程,例如dom操作中, 增删元素就不可能同时进行
  35. * 5. 单线程可确保js按用户要求的顺序执行,并确定业务逻辑正确,结果可控
  36. * 6. 但是单线程,也决定了所有任务必须在一个执行栈中完成,导致耗时任务必然会阻塞整个线程
  37. * 7. 解决文案: 任务队列与事件循环(事件轮询)
  38. * 通信解释:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
  39. *
  40. * -----------------------------------------------------------------
  41. *
  42. * (三) 单线程,任务队列,事件循环之间的关系与协同
  43. * 1. js所有任务都在主线程中"同步"执行
  44. * 2. 异步任务以回调的形式声明,并离开主线程,交给多线程的浏览器去执行
  45. * 3. 异步任务执行完毕,进入到"任务队列"中排队等待进入主线程执行
  46. * 4. 主线程同步任务全部完成后, 通过"事件循环"查询"任务队列"中是否有等待的任务
  47. * 5. 如果有,则该就绪任务进入主线程同步执行
  48. * 6. 该任务完成后, 事件循环会再次取出下一个就绪的异步任务进入主线程
  49. * 7. 以上过程不断重复, 直到主线程中的同步任务, 任务队列中的异步任务全部执行完毕
  50. */
  51. // 定时器演示
  52. // console.log(): 同步代码, 在函数栈/单线程中执行
  53. console.log('100');
  54. console.log('200');
  55. console.log('300');
  56. console.log('--------');
  57. console.log('10');
  58. setTimeout(function(){
  59. console.log('20');
  60. },5000);
  61. setTimeout(() => {console.log('21'); },6000);
  62. setTimeout('console.log(400)', 2000);
  63. console.log('30');
  64. // 异步任务优先级比 setTimeout高
  65. window.onload = ( ) => console.log('等待');
  66. </script>
  67. </body>
  68. </html>

效果

ajax-xhr

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  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>ajax-xhr</title>
  8. </head>
  9. <body>
  10. <button onclick="getUser1(this)">查询用户信息:XHR</button>
  11. <button onclick="getUser2(this)">查询用户信息:fetch</button>
  12. <script>
  13. // AJAX : 局部更新,用户不需要离开当前页面就能看到新内容
  14. // 1. 传统 XHR
  15. /**
  16. * 1. 创建对象: new XMLHttpRequest();
  17. * 2. 响应类型: xhr.responseType = "json";
  18. * 3. 配置参数: xhr.open("GET", url, true);
  19. * 4. 请求回调: xhr.onload = () => console.log(xhr.response);
  20. * 5. 失败回调: xhr.onerror = () => console.log("Error");
  21. * 6. 发起请求: xhr.send(null);
  22. *
  23. * xhr 至少监听2个事件: load,error, 调用2个函数: open,send
  24. * post请求,需要设置一下请求头与请求的数据,其它与get请求完全相同
  25. */
  26. function getUser1 ( btn) {
  27. // 1. 创建对象: new XMLHttpRequest();
  28. const xhr = new XMLHttpRequest();
  29. // * 2. 响应类型: xhr.responseType = "json";
  30. xhr.responseType = "json"
  31. // * 3. 配置参数: xhr.open("GET", url, true); 默认 是 true 可以不写
  32. // let url = 'https://jsonplaceholder.typicode.com/users';
  33. let url = 'https://jsonplaceholder.typicode.com/users?id=1';
  34. // 不传 get 参数默认是所有用户信息 , // 如果有get参数,用户id,用ul列表显示
  35. xhr.open("GET", url, true);
  36. // * 4. 请求回调: xhr.onload = () => console.log(xhr.response);
  37. xhr.onload = () =>
  38. {
  39. console.log(xhr.response);
  40. render(xhr.response, btn);
  41. }
  42. // * 5. 失败回调: xhr.onerror = () => console.log("Error");
  43. xhr.onerror = () => console.log("Error");
  44. // * 6. 发起请求: xhr.send(null);
  45. xhr.send(null);
  46. }
  47. </script>
  48. <script>
  49. //2、 fetch 链式操作 操作都是异步的,通过then 使顺序可控. then (里面是函数)
  50. /**
  51. * fetch(url)
  52. * .then(res)
  53. * .then(...)
  54. * .catch(err)
  55. */
  56. function getUser2 ( btn ) {
  57. let url = 'https://jsonplaceholder.typicode.com/users?id=2';
  58. fetch( url)
  59. .then (function (response){
  60. return response.json();
  61. } )
  62. .then (function(json){
  63. // 控制台
  64. console.log(json);
  65. // 页面渲染到页面
  66. render(json,btn)
  67. } );
  68. /**
  69. * xhr 与 fetch?
  70. * 1. xhr: 传统ajax
  71. * 2. fetch: 现代异步请求, 推荐,基于Promise对象
  72. */
  73. }
  74. </script>
  75. <script src="../0801/0801/js/function.js"></script>
  76. </body>
  77. </html>

效果

fetch-api 、async、await

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  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-api 、async、await</title>
  8. </head>
  9. <body>
  10. <!-- fetch-api 是浏览器原生实现的异步技术 可直接用 -->
  11. <button onclick="getUser(this)">查询用户信息: Fetch</button>
  12. <script>
  13. // axios : 基于 异步 xhr 、fetch
  14. // fetch :基于 promise ,返回 promise 对象
  15. // console.log(fetch());
  16. // fetch('https://jsonplaceholder.typicode.com/todos/1')
  17. // .then(response => response.json())
  18. // .then(json => {
  19. // console.log(json)
  20. // });
  21. // async 当前是个异步函数
  22. async function getUser( btn){
  23. let url = 'https://jsonplaceholder.typicode.com/todos/1';
  24. // 异步耗时操作,需要等待结果才能进入一下步
  25. const response = await fetch(url);
  26. // 获取到 结果之后,再转为json
  27. const result = await response.json()
  28. console.log(result);
  29. render(result,btn);
  30. }
  31. </script>
  32. <script src="../0801/0801/js/function.js"></script>
  33. <script>
  34. // fetch api : 浏览器原生实现的异步技术
  35. // axios: 基于 xhr / fetch
  36. // fetch: 基于Promise, 返回 Promise对象
  37. // console.log(fetch());
  38. // fetch('https://jsonplaceholder.typicode.com/todos/2')
  39. // .then(response => response.json())
  40. // .then(json => console.log(json));
  41. // fetch('https://jsonplaceholder.typicode.com/users')
  42. // .then(response => response.json())
  43. // .then(json => console.log(json));
  44. // 下面我们请求自己的数据接口
  45. // let url = 'http://website.io/users.php';
  46. // fetch(url)
  47. // .then(response => response.json())
  48. // .then(json => console.log(json));
  49. // 报 CORS 跨域请求错误
  50. // 同源策略: 仅允许"协议相同,域名相同,端口相同",否则就是跨域请求,这是禁止的
  51. // function getUser(btn) {
  52. // let url = 'http://website.io/users.php?id=1';
  53. // fetch(url)
  54. // .then(response => response.json())
  55. // .then(json => {
  56. // console.log(json);
  57. // // 将数组渲染到页面中
  58. // render(json, btn);
  59. // });
  60. // }
  61. // ECMA2017中, 有async,await,用来简化异步回调方法
  62. // async: 当前是一个异步函数
  63. </script>
  64. </body>
  65. </html>

效果

模块的导入与导出

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  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. <!-- 默认script在浏览器环境下不支持模块,需要指定type -->
  11. <script type="module">
  12. // js中, 所有代码共用一个全局作用域: window
  13. // 导入模块
  14. import { username1, hello } from './zuoyemodules/m1.js';
  15. console.log(hello());
  16. console.log(username1);
  17. console.log(hello(username1));
  18. console.log('==============');
  19. import{ username2, hello2 }from './zuoyemodules/m1.js';
  20. console.log(hello2());
  21. console.log(username2);
  22. console.log(hello(username2));
  23. console.log('==============');
  24. import {myname,getName} from './zuoyemodules/m1.js';
  25. console.log(getName());
  26. console.log(myname);
  27. console.log(getName(myname));
  28. console.log('==============');
  29. // 当前模块中不允许有 重名的成员
  30. import { myname4 as name , getName4 as getUser } from './zuoyemodules/m1.js';
  31. let myname4 = '小龙'
  32. function getName4 (name) {
  33. return 'hell' +name;
  34. }
  35. console.log(name);
  36. console.log(getUser(name));
  37. console.log('==============');
  38. // 导入模块的默认成员 不要用对象字面量,用标识符
  39. // 只要不用对象字面量接收模块成员,就是默认导出
  40. // 自己命名 User
  41. import User from './zuoyemodules/m1.js';
  42. console.log(typeof User);
  43. const user = new User('小猫')
  44. console.log(user.username5);
  45. console.log(user.geUsername5(user.username5));
  46. console.log('==============');
  47. // 只要不用对象字面量接收模块成员,就是默认导出
  48. // 混合导入
  49. // 接收混合导入成员,默认成员命名,必须要放到 非默认的前面
  50. // import useremail , { username6, hello6} from './zuoyemodules/m2.js';
  51. // console.log(useremail);
  52. // console.log(username6);
  53. // console.log(hello6(username6));
  54. </script>
  55. </body>
  56. </html>

JS

  1. // js 模块知识
  2. // 模块就是一个js文档
  3. // 模块有自己独立的作用域(全局、函数、块)
  4. // 模块内成员,默认全部私有。只有导出后才能呗外部使用
  5. // 1、逐个导出
  6. // export let username1 = "小猪" ;
  7. // export function hello (username1){
  8. // return 'hello, ${username1}';
  9. // // return ' ${username1}';
  10. // }
  11. export let username1 = '猪老师';
  12. export function hello(username1) {
  13. // 注意反引号
  14. return `Hello, ${username1}`;
  15. }
  16. // 2、批量导出
  17. // 两步走
  18. // 2.1、声明
  19. let username2 = '小狗';
  20. function hello2 (username2 ){
  21. // 注意反引号
  22. return `hello,${username3}`;
  23. }
  24. // 2.2批量导出
  25. export {username2,hello2};
  26. // 3 别名导出
  27. // 3.1声明
  28. let username3 = '小马';
  29. function hello3 (username3){
  30. return `Hello, ${username3}`;
  31. }
  32. // 3.2 别名导出
  33. export {username3 as myname ,hello3 as getName};
  34. // 4 别名导出
  35. // 4.1声明
  36. let username4 = '小马';
  37. function hello4 (username4){
  38. // 注意反引号
  39. return `hello,${username4}`;
  40. }
  41. // 4.2 别名导出
  42. export {username4 as myname4 ,hello4 as getName4};
  43. //5、 默认导入
  44. // 5.1、
  45. export default class {
  46. constructor (username5) {
  47. this.username5 =username5;
  48. }
  49. geUsername5 (){
  50. return `hell0 , ${this.username5}`;
  51. }
  52. }

效果

混合导出与命名空间

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  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. <script type="module">
  11. import useremail , { username6, hello6} from './zuoyemodules/m2.js';
  12. console.log(useremail);
  13. console.log(username6);
  14. console.log(hello6(username6));
  15. console.log('=========');
  16. // 导入的成员过多时,使用 {。。。。}会很长
  17. // 可以将所有导入的成员都挂载到 一个对象上
  18. // 此时导入的模块成员,自动成为该对象的属性
  19. // 这个对象就是命名空间
  20. import * as user from './zuoyemodules/m2.js';
  21. console.log(user);
  22. console.log(user.username6);
  23. console.log(user.hello6(username6));
  24. console.log(user.default);
  25. console.log(user.hello6(user.username6));
  26. </script>
  27. </body>
  28. </html>

js

  1. //6、 混合导出 默认成员与非默认成员的导出
  2. // 6.1、
  3. let username6 = '小妞';
  4. function hello6 (username6) {
  5. return `hel ,${username6}`;
  6. }
  7. let email6= '1234@qq.com';
  8. // // 私有成员不对外
  9. let sex = 'male';
  10. // // 将邮箱 email6作为默认导出
  11. export {username6 ,hello6 , email6 as default};

效果

Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!