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对象,等待所有同时成功完成(或某一个失败),做后续逻辑

语法:

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

复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Promise的all方法</title>
</head>

<body>
  <ul class="my-ul"></ul>
  <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  <script>
    /**
     * 目标:掌握Promise的all方法作用,和使用场景
     * 业务:当我需要同一时间显示多个请求的结果时,就要把多请求合并
     * 例如:默认显示"北京", "上海", "广州", "深圳"的天气在首页查看
     * code:
     * 北京-110100
     * 上海-310100
     * 广州-440100
     * 深圳-440300
    */
    // 1. 请求城市天气,得到Promise对象
    const bjPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '110100' } })
    const shPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '310100' } })
    const gzPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '440100' } })
    const szPromise = axios({ url: 'http://hmajax.itheima.net/api/weather', params: { city: '440300' } })

    // 2. 使用Promise.all,合并多个Promise对象
    const p = Promise.all([bjPromise, shPromise, gzPromise, szPromise])
    p.then(result => {
      // 注意:结果数组顺序和合并时顺序是一致
      console.log(result)
      const htmlStr = result.map(item => {
        return `<li>${item.data.data.area} --- ${item.data.data.weather}</li>`
      }).join('')
      document.querySelector('.my-ul').innerHTML = htmlStr
    }).catch(error => {
      console.dir(error)
    })
  </script>
</body>

</html>
相关推荐
鱼鱼块10 分钟前
《最小栈的巧妙设计:用辅助栈实现 O(1) 获取最小值》
javascript·算法·面试
San3011 分钟前
反转字符串与两数之和:两道简单题背后的 JavaScript 思维深度
javascript·算法·面试
孟祥_成都12 分钟前
前端角度学 AI - 15 分钟入门 Python
前端·人工智能
掘金安东尼14 分钟前
Astro 十一月更新:新特性与生态亮点(2025)
前端
拉不动的猪14 分钟前
判断dom元素是否在可视区域的常规方式
前端·javascript·面试
Hilaku34 分钟前
如何用隐形字符给公司内部文档加盲水印?(抓内鬼神器🤣)
前端·javascript·面试
guxuehua37 分钟前
Monorepo Beta 版本发布问题排查与解决方案
前端
猫头虎-前端技术37 分钟前
小白也能做AI产品?我用 MateChat 给学生做了一个会“拍照解题 + 分步教学”的AI智能老师
前端·javascript·vue.js·前端框架·ecmascript·devui·matechat
b***666139 分钟前
前端的dist包放到后端springboot项目下一起打包
前端·spring boot·后端
栀秋66640 分钟前
ES6+新增语法特性:重塑JavaScript的开发范式
前端·javascript