異步任務棧分為:
宏任務(macrotask
):
- setTimeout
- setImmediate
- setInterval
- MessageChannel
- UI rendering
- 網絡I/O以及用戶I/O
- network
微任務(microtask
):
- process.nextTick
- Promise
- Object.observe
- MutationObserver
事件循環機制
- 執行一個宏任務(棧中沒有就從事件隊列中獲取)
- 執行過程中如果遇到微任務,就將它添加到微任務的任務隊列中
- 宏任務執行完畢后,立即執行當前微任務隊列中的所有微任務(依次執行)
- 當前宏任務執行完畢,開始檢查渲染,然后GUI線程接管渲染
- 渲染完畢后,JS線程繼續接管,開始下一個宏任務(從事件隊列中獲取)
requestAnimationFrame
:會再UI渲染之前執行,微任務執行完之后
requestIdleCallback
:會在幀的剩余空閑時間執行,如果傳第二個參數超時時間,沒有空閑時間的話會強制執行
image.png
宏任務 ---> 微任務 ---> requestAnimationFrame --->UI線程渲染 ---> 宏任務
image.png