巨集任務和微任務
事件迴圈:
- 同步和非同步任務分別進入不同的執行"場所",同步的進入主執行緒,非同步的進入Event Table並註冊函式
- 當指定的事情完成時,Event Table會將這個函式移入Event Queue
- 主執行緒內的任務執行完畢為空,會去Event Queue讀取對應的函式,進入主執行緒執行
console.log(1);
setTimeout(() => {
console.log(2);
}, 0);
console.log(3);
// 1 3 2
巨集任務和微任務
不同的非同步事件,會進入不同的Event Queue,進一步把非同步事件劃分為巨集任務和微任務
- 巨集任務主要有:setTimeout、setInterval、I/O、script程式碼塊等
- 微任務的主要有:nextTick、callback、Promise、process.nextTick等
執行順序
進入整體程式碼(巨集任務)後,開始第一次迴圈。接著執行所有的微任務。然後再次從巨集任務開始,找到其中一個任務佇列執行完畢,再執行所有的微任務。
例子1:在同一個按鈕上繫結兩個點選事件,使用者點選按鈕,輸出的順序是什麼?
button.addEventListener('click',() => {
Promise.resolve().then(() => console.log('Promise 1'))
console.log('Listener 1')
})
button.addEventListener('click',() => {
Promise.resolve().then(() => console.log('Promise 2'))
console.log('Listener 2')
})
// button.click() // 如果使用js程式碼執行點選事件,輸出結果會有變化嗎
輸出結果是
Listener 1 Promise 1 Listener 2 Promise 2
參考:
https://juejin.im/post/6844904198581010439#heading-13
相關文章
- JavaScript巨集任務和微任務JavaScript
- Event Loop、 巨集任務和微任務OOP
- js中的巨集任務和微任務JS
- 任務佇列,巨集任務與微任務佇列
- JavaScript的巨集任務與微任務JavaScript
- 微任務和巨集任務哪個先執行
- 微任務、巨集任務與Event-LoopOOP
- macrotask 巨集任務 + microtask 微任務區別Mac
- javascript事件環微任務和巨集任務佇列原理JavaScript事件佇列
- 前端急速解決非同步之微任務和巨集任務前端非同步
- js的setTimeout和Promise—同步非同步和微任務巨集任務JSPromise非同步
- JS中EventLoop、巨集任務與微任務的個人理解JSOOP
- 瞭解js執行機制——微任務與巨集任務JS
- 關於非同步方法中的巨集任務與微任務非同步
- JS事件迴圈機制(event loop)之巨集任務/微任務JS事件OOP
- async與await以及巨集微任務AI
- JavaScript的事件迴圈與巨集微任務JavaScript事件
- node基礎面試事件環?微任務、巨集任務?一篇帶你飛面試事件
- 總結:JavaScript非同步、事件迴圈與訊息佇列、微任務與巨集任務JavaScript非同步事件佇列
- UI 阻塞行為:微任務與宏任務UI
- 使用ant巨集定義任務
- javaScript 之 蟻人<微任務>JavaScript
- 如何理解 JS 非同步程式設計的,EventLoop、訊息佇列,什麼是巨集任務,什麼是微任務?JS非同步程式設計OOP佇列
- 程序和任務
- 詳解JavaScript的任務、微任務、佇列以及程式碼執行順序JavaScript佇列
- 任務
- 探究如何在Zoho Projects中建立和管理任務和子任務Project
- SpringBoot與非同步任務、定時任務、郵件任務Spring Boot非同步
- Django配置celery執行非同步任務和定時任務Django非同步
- 啟動和停止任務
- 任務系統之Jenkins子任務Jenkins
- 敏捷開發-任務拆解、工作量評估和任務指派敏捷
- Flowable啟動流程例項和查詢任務以及完成任務
- 任務池
- 任務05
- crontab任務
- 任務四
- 近日任務