setTimeout(function() {
console.log('setTimeout');
})
new Promise(function(resolve) {
console.log('promise');
}).then(function() {
console.log('then');
})
console.log('console');
複製代碼
setTimeout
,將其回調函數註冊後分發到宏任務事件隊列中(做爲下一次循環宏任務調用)Promise
,new Promise
當即執行,打印'promise',then
函數分發到微任務事件隊列(本次宏任務的微任務)console.log()
,當即執行then
,執行setTimeout
,打印'promise'console.log('Hello World!');
const p1 = new Promise((resolve) => {
console.log(3);
resolve(4);
});
const p2 = new Promise((resolve) => {
console.log(1);
setTimeout(() => {
console.log(6)
}, 0);
resolve(2);
});
p1.then((res) => {
console.log(res)
});
p2.then((res) => {
console.log(res)
});
console.log(5);
複製代碼
p1
中打印'3',resolve(4)
在then
函數中分發到微任務事件隊列p2
中打印'1',遇到setTimeout
,將其回調函數註冊分發到宏任務事件隊列resolve(2)
在then
函數中分發到微任務事件隊列;向下執行,再打印'5'setTimeout
,打印'6'console.log('1');
setTimeout(function first () {
console.log('2');
setTimeout(function third () {
new Promise(function(resolve) {
console.log('3');
resolve();
}).then(function() {
console.log('4')
})
})
})
new Promise(function(resolve) {
console.log('5');
resolve();
}).then(function() {
console.log('6')
})
setTimeout(function second () {
console.log('7');
new Promise(function(resolve) {
console.log('8');
resolve();
}).then(function() {
console.log('9')
})
})
複製代碼
setTimeout
的回調函數first
註冊分發到宏任務事件隊列Promise
中打印'5',then
函數分發到微任務事件隊列setTimeout
,將其回調函數second
註冊分發到宏任務事件隊列中then
函數,打印'6'first
函數打印'2';而後又遇到了setTimeout
函數,將third
函數註冊分發到宏任務事件隊列中(下次循環纔會調用)second
函數打印'7',進入promise
打印'8',then
函數註冊分發到微任務事件隊列then
函數,打印'9'third
函數,先打印'3',再執行then
中打印'4'全部的同步任務都在主線程上執行,造成一個執行棧javascript
主線程以外,還存在一個任務隊列,只要異步任務有了運行結果,就在任務隊列中放置一個事件java
一旦執行棧中全部同步任務執行完畢,系統就會讀取任務隊列中的事件,異步任務結束等待狀態,進入執行棧,開始執行node
重複上一步(事件輪循——重複讀取主線程和任務隊列中的事件)promise
在js中的任務作更精確的定義:異步
在本次循環執行中,先執行宏任務,再執行微任務,都完成後,開始第二輪循環,執行宏任務,執行微任務,直到沒有宏任務,完成執行函數
圖片來源post