var wait = function (ms) {
return new Promise((resolve) => {
console.log("promise"); //promise的構造函數是同步代碼,立即執行
setTimeout(() => {
console.log("resolve"); //宏任務
resolve();
}, ms);
});
};
Promise.resolve().then(() => {
console.log("mocro"); //微任務
});
setTimeout(() => {
console.log("timeout"); //宏任務
}, 0);
var delayPrint = async function (ms) {
console.log("begin");
await wait(ms);
console.log("print");
};
delayPrint(0);
//輸出順序
// begin
// promise
// mocro
// timeout
// resolve
// print
nodejs是單線程異步非阻塞任務,這裏單線程指用戶主線程,主線程配合時間循環隊列實現程序運行。
主線程循序執行用戶同步代碼,當遇到定時器時將定時器任務放到事件隊列中,遇到promise將函數放到微任務隊列中。當主線程執行完畢同步代碼後,先檢查是否又微任務,如果有執行,再檢查宏任務,如果有則執行。如果在微任務中編寫定時器任務,也會插入到宏人物中。
需要注意的是:
- 無論是宏任務還是微任務,執行主體都是用戶主線程。
- 當多個settimout定時事件爲0時,回調函數會根據插入任務隊列順序執行其回調函數。
上述代碼輸出執行順序爲:
// 1. 同步任務 一般程序和promise的構造語句
// 2. 微任務 promise的resolve 和 reject
// 3. 宏人物 定時器等 定時器定時時間一樣時根據建立順序輸出