JavaScript 中的微任务(microtask)和宏任务(macrotask)都是异步任务,但它们之间有一些关键的区别。
宏任务是由浏览器在主事件循环之外调度的任务。常见的宏任务包括 setTimeout、setInterval、ajax 请求、DOM 事件等。它们会被添加到任务队列中,等待主事件循环来执行。
微任务是在当前任务执行结束后立即执行的任务。它们执行时机比宏任务要早。常见的微任务包括 Promise 的 then 方法、MutationObserver、Object.observe 等。它们会被添加到微任务队列中,等待主事件循环执行栈中的任务执行结束后执行。
下面是一个演示代码,用来展示微任务和宏任务之间的区别:
console.log("script start")
setTimeout(function() {
console.log("setTimeout")
}, 0)
Promise.resolve().then(function() {
console.log("promise1")
}).then(function() {
console.log("promise2")
})
console.log("script end")
上述代码中,我们使用了 setTimeout 和 Promise 来创建了一个宏任务和两个微任务。当代码执行时,会按照以下顺序输出:
script start
script end
promise1
promise2
setTimeout
可以看到,微任务会在当前任务执行完毕后立即执行,而宏任务则需要等待主事件循环来执行。