浏览器里的微任务和宏任务是什么?
浏览器中并不存在宏任务( Macrotask ), 宏任务是 Node.js 发明的术语
浏览器中只有任务( Task )和微任务( Microtask )
- 使用 script 标签、setTimeout 可以创建任务
- 使用 Promise.then, window.queueMicrotask, MutationObserver, Proxy 可以创建微任务
微任务会在任务间隙执行( 插队执行 )
微任务队列执行完才会执行任务队列
看下面的示例,输出结果是什么呢?
Promise.resolve()
.then(() => {
console.log(0)
return Promise.resolve(4)
})
.then((res) => { console.log(res)})
Promise.resolve()
.then(() => console.log(1))
.then(() => console.log(2))
.then(() => console.log(3))
.then(() => console.log(5))
.then(() => console.log(6))
一个 return Promise
等价于 2个 Promse.then
Promise.resolve()
.then(() => {
console.log(0)
})
.then(() => {
Promise.resolve().then(() => {
Promise.resolve().then(() => console.log(4))
}
)
})
Promise.resolve()
.then(() => console.log(1))
.then(() => console.log(2))
.then(() => console.log(3))
.then(() => console.log(5))
.then(() => console.log(6))
- 连续的.then必须一个 .then 完成后才能把下一个.then 放入next 队列
- 同级的 .then 可以同时放入 next 队列
队列变化如下:
- console.log(0) 和 console.log(1) 入队:[0, 1]
- 0 出队,x(y(4)) 入队; 1 出队,2 入队: [x(y(4)), 2]
- x(y(4)) 出队,y(4) 入队;2 出队,3 入队: [y(4), 3]
- y(4) 出队,4 入队;3 出队,5 入队:[4, 5]
- 4 出队,5 出队,6 入队: [6]
- 6 出队
故输出顺序为:0,1,2,3,4,5,6