JavaScript事件循环
- js是单线程
- 事件循环
-
宏任务
- script整体代码
- setTimeout
- setInterval
- setImmediate
- I/O
- UI rendering
-
微任务
- Promise
- Object.observe
- MutaionObserver
-
优先级
- process.nextTick > Promise.then > setTimeout > setImmediate
- 微任务会在当前所处的宏任务之后,平级的宏任务之前执行
- script标签内的代码是一个宏任务。其中的子级setTimeout是一个子级宏任务,
Promise.resolve().then(() => console.log(4))
是一个子级微任务。所以会先执行子级微任务,再执行子级宏任务
- script标签内的代码是一个宏任务。其中的子级setTimeout是一个子级宏任务,
- 宏任务包含微任务,以此嵌套。当前宏任务中的子级宏任务会在当前宏任务的最后执行;当前宏任务中的子级微任务会在当前宏任务执行完成之后,且在当前宏任务的子级宏任务执行之前执行
-
案例
console.log(1); setTimeout(() => { // 宏任务队列 console.log(2) }, 3000); Promise.resolve().then(console.log(3)) console.log(4) // 结果:1,3,4,2
console.log(1); setTimeout(() => { // 宏任务队列 console.log(2) }, 3000); Promise.resolve().then(() => console.log(3)) console.log(4) // 结果:1,4,3,2
-
案例总结:
- then方法可以接收一个Promise执行成功的回调函数,和一个执行失败的回调函数。
- 案例1接收的是一个表达式
console.log()
,这个表达式会被优先调用
,然后将返回值传递给then方法 - 第二个案例传递给then方法的是Promise执行成功之后的回调函数,这个回调函数是微任务
-
以上内容仅为查阅多方资料的一个总结性的个人笔记