• AJAX——事件循环(EventLoop)


    1.事件循环(EventLoop)

    概念:JavaScript有一个基于事件循环的并发模型,事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。这个模型与其它语言中的模型截然不同,比如C和Java。

    原因:JavaScript单线程(某一刻只能执行一行代码),为了让耗时代码不阻塞其他代码运行,设计了事件循环模型

    1.1 事件循环-执行过程

    定义:执行代码和收集异步任务的模型,在调用栈空闲,反复调用任务队列里回调函数的执行机制,就叫事件循环。

     执行过程例子

    1.2 总结

    1.什么是事件循环?

    执行代码和收集异步任务,在调用栈空闲时,反复调用任务队列里回调函数执行机制

    2.为什么有事件循环?

    JavaScript是单线程的,为了不阻塞JS引擎,设计执行代码的模型

    3.JavaScript内代码如何执行?

    • 执行同步代码,遇到异步代码交给宿主浏览器环境执行
    • 异步有了结果后,把回调函数放入任务队列排队
    • 当调用栈空闲后,反复调用任务队列里的回调函数

    2.事件循环-练习

    使用模型,分析代码执行过程

    运行结果:

    3.宏任务与微任务

    ES6之后引入了Promise对象,让JS引擎也可以发起异步任务

    异步任务分为:

    • 宏任务:由浏览器环境执行的异步代码

    • 微任务:由JS引擎环境执行的异步代码

     

    JavaScript内代码如何执行?

    1. 执行第一个script脚本事件宏任务,里面同步代码
    2. 遇到宏任务/微任务交给宿主环境,有结果回调函数进入对应队列
    3. 当执行栈空闲时,清空微任务队列,再执行下一个宏任务,从1再来

    练习:事件循环经典题

    运行结果:

    4.Promise.all 静态方法

    概念:合并多个Promise对象,等待所有同时成功完成(或某一个失败),做后续逻辑

    语法:

     

    需求:同时请求“北京”,“上海”,“广州”,“深圳”的天气并再网页尽可能同时显示

    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>Promise的all方法</title>
    8. </head>
    9. <body>
    10. <ul class="my-ul"></ul>
    11. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    12. <script>
    13. /**
    14. * 目标:掌握Promise的all方法作用,和使用场景
    15. * 业务:当我需要同一时间显示多个请求的结果时,就要把多请求合并
    16. * 例如:默认显示"北京", "上海", "广州", "深圳"的天气在首页查看
    17. * code:
    18. * 北京-110100
    19. * 上海-310100
    20. * 广州-440100
    21. * 深圳-440300
    22. */
    23. // 1. 请求城市天气,得到Promise对象
    24. const bjPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '110100' } })
    25. const shPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '310100' } })
    26. const gzPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '440100' } })
    27. const szPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '440300' } })
    28. // 2. 使用Promise.all,合并多个Promise对象
    29. const p = Promise.all([bjPromise, shPromise, gzPromise, szPromise])
    30. p.then(result => {
    31. // 注意:结果数组顺序和合并时顺序是一致
    32. console.log(result)
    33. const htmlStr = result.map(item => {
    34. return `<li>${item.data.data.area} --- ${item.data.data.weather}</li>`
    35. }).join('')
    36. document.querySelector('.my-ul').innerHTML = htmlStr
    37. }).catch(error => {
    38. console.dir(error)
    39. })
    40. </script>
    41. </body>
    42. </html>

  • 相关阅读:
    动态行、列,并且合并
    【6. 操作系统—虚拟内存管理技术页面置换算法】
    【计算机组成与体系结构Ⅰ】章节测试(1-3)
    C#的File 类使用说明
    贫血模型与充血模型
    基于BlockingQueue的异步处理
    Selenium获取百度百科旅游景点的InfoBox消息盒
    flutter 环境搭建(windows)(先装 jdk 建议1.8起步)
    如何做一个能用的 JAVA 的 Websocket 聊天室?
    TypeScript核心
  • 原文地址:https://blog.csdn.net/weixin_48719464/article/details/138088507