# Event Loop

事件循环机制(Event Loop)

💥 Event Loop机制 (opens new window)

浏览器和Node.js中的Event Loop (opens new window)

结论

  • 微任务执行时机比宏任务
  • 宏任务:setTimeoutsetIntervalDOM事件Ajax请求
  • 微任务:Promiseasycn/await

下面代码执行结果:

console.log(1)

// 宏任务
setTimeout(() => {
	console.log(2)
}, 0)

// 微任务
Promise.resolve().then(() => {
  console.log(3)
})

console.log(4)

// 1 4 3 2

/**
 * 结论:微任务 执行时机比宏任务早!
 * 原因:微任务 > DOM渲染 > 宏任务
 **/

https://zhuanlan.zhihu.com/p/448426887

document.body.innerHTML = ` 
    <button id="btn" type="button">btn</button> 
`; 

const button = document.getElementById('btn')
 
button.addEventListener('click',()=>{
  Promise.resolve().then(()=>console.log('promise resolved 1'))
  console.log('listener 1')
})
 
button.addEventListener('click',()=>{
  Promise.resolve().then(()=>console.log('promise resolved 2'))
  console.log('listener 2')
})
 
// 1. 手动点击按钮 
// button.click() // 2. 解开这句注释,用JS触发点击行为
  • 手动点击按钮时: listener1 -> promise resolved 1 -> listener2 -> promise resolved 2
  • 当我们使用2: listener1 -> listener2 -> promise resolved 1 -> promise resolved 2

UI 触发的 click 事件是异步的,每个 listener 是一个 macrotask;代码触发的 click 底层是 dispatchEvent,这是一个同步的方法,会同步执行所有 listener

Last Updated: 6/15/2022, 2:45:24 PM