事件循环(Event Loop)
1.什么是事件循环?
JavaScript为单线程执行的,所以是从上到下依次执行,js分为两个任务,宏任务和微任务
首先执行宏任务(第一次就是执行所有的同步代码),再执行所有的微任务,执行完毕之后再次执行
宏任务,执行完毕再次执行所有的微任务,也就是:
宏任务 --> 微任务 --> 宏任务 --> 微任务
2.什么是宏任务,微任务?
宏任务:
script(全局任务), setTimeout, setInterval, setImmediate, I/O, UI rendering.
微任务:
process.nextTick, Promise.then, Object.observer, MutationObserver.
3.案例深入解读
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
setTimeout(function(){ console.log(1) },0) new Promise((resolve,reject)=>{ console.log(2) resolve(3) setTimeout(function(){ console.log(5) promise.resolve },0) }).then((val)=>{ console.log(val)<br> }) console.log(4) |
解读:
首先执行宏任务(同步代码) :console.log(2) console.log(4)
再执行所有的微任务 console.log(3)
再一次从上到下执行所有的微任务:console.log(1) console.log(5)
所以正确答案是 2 4 3 1 5
我们再加大难度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
console.log( 'start' ) setTimeout(() => { console.log( 'setTimeout 1' ) Promise.resolve().then(() => { console.log( 'promise 3' ) }).then(() => { console.log( 'promise 4' ) }).then(() => { setTimeout(() => { console.log( 'setTimeout 2' ) Promise.resolve().then(() => { console.log( 'promise 5' ) }).then(() => { console.log( 'promise 6' ) }) }, 0) }) }, 0) Promise.resolve().then(() => { console.log( 'promise 1' ) }).then(() => { console.log( 'promise 2' ) }) |
解读:
我们先执行同步代码: start
微任务:promise 1 , promise 2
宏任务: setTimeout 1
微任务:promise 3, promise 4
宏任务:setTimeout 2 ,
微任务:promise 5,promise 6
正确答案
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!