概念:JavaScript有一个基于事件循环的并发模型,事件循环负责执行代码、收集和处理事件以及执行队列中的子任务。这个模型与其它语言中的模型截然不同,比如C和Java。
原因:JavaScript单线程(某一刻只能执行一行代码),为了让耗时代码不阻塞其他代码运行,设计了事件循环模型
定义:执行代码和收集异步任务的模型,在调用栈空闲,反复调用任务队列里回调函数的执行机制,就叫事件循环。
执行过程例子
1.什么是事件循环?
执行代码和收集异步任务,在调用栈空闲时,反复调用任务队列里回调函数执行机制
2.为什么有事件循环?
JavaScript是单线程的,为了不阻塞JS引擎,设计执行代码的模型
3.JavaScript内代码如何执行?
使用模型,分析代码执行过程
运行结果:
ES6之后引入了Promise对象,让JS引擎也可以发起异步任务
异步任务分为:
JavaScript内代码如何执行?
练习:事件循环经典题
运行结果:
概念:合并多个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>