浏览器里的微任务和宏任务是什么?
浏览器中并不存在宏任务( 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
