Skip to content

宏任务和微任务

宏任务和微任务是事件循环中的两种任务类型,都属于异步任务

宏任务:script 脚本,setTimeoutsetIntervalsetImmediateI/OUI rendering

微任务:Promiseprocess.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之后执行的,因为他俩不在同一次事件循环中。 所以,你问题的关键是在于你指的是一次事件循环中还是一整段代码中。

  • 事件循环中,宏任务先执行()
  • 整段代码中,异步的微任务先执行