宏任务和微任务
宏任务和微任务是事件循环中的两种任务类型,都属于异步任务。
宏任务:script 脚本,setTimeout,setInterval,setImmediate,I/O,UI rendering
微任务:Promise,process.nextTick
执行一段代码时,整段代码会作为宏任务进入主线程执行,接下来会有3种情况:
- 同步代码,直接执行
- 碰到
setTimeout,分发到宏任务队列 - 碰到
Promise.then,分发到微任务队列
js
console.log(1); // 直接执行
setTimeout(function() {
console.log(2); // 进入宏任务队列
})
new Promise(function(resolve) {
console.log(3); //直接执行
resolve()
}).then(function() {
console.log(4); // 进入微任务队列
})
console.log(5); // 直接执行在一次事件循环中,会先执行宏任务(主线程)再执行微任务(then)。
都执行完后则进入下一次事件循环,再从宏任务开始执行(setTimeout)。
所以在整段代码中,setTimeout是在then之后执行的,因为他俩不在同一次事件循环中。 所以,你问题的关键是在于你指的是一次事件循环中还是一整段代码中。
- 事件循环中,宏任务先执行()
- 整段代码中,异步的微任务先执行