淺談promise和js執行機制(二)

chaos_G發表於2019-06-24

讓我們繼續上一次遺留的問題:

setTimeout(function(){
  console.log('1')
});
new Promise(function(resolve){
    console.log('2');
    resolve();
}).then(function(){
    console.log('3')
});
console.log('4');

複製程式碼

最終的結果是2,4,3,1

不知道和大家預想的是否一樣,那為什麼是這種結果呢?我們今天一起來探討一下!

在這段程式碼中既有setTimeout又有Promise,那究竟在js中是什麼執行順序呢?這其實就設計到了巨集任務和微任務、同步任務和非同步任務

同步任務: 指的是在主執行緒上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務。

非同步任務: 指的是不進入主執行緒,某個非同步任務可以執行了,該任務才會進入主執行緒執行。

同步和非同步任務分別進入不同的執行"場所",同步的進入主執行緒,非同步的進入Event Table並註冊函式。當指定的事情完成時,Event Table會將這個函式移入Event Queue。主執行緒內的任務執行完畢為空,會去Event Queue讀取對應的函式,進入主執行緒執行。上述過程會不斷重複,也就是常說的Event Loop(事件迴圈)。

淺談promise和js執行機制(二)

1.所有同步任務都在主執行緒上執行,形成一個執行棧(execution context stack)

2.主執行緒之外,還存在一個“任務佇列”,只要非同步任務有了執行結果,就在“任務佇列”之中放置一個事件

3.一旦“執行棧”中的所有同步任務執行完畢,系統就會讀取“任務佇列”,看看裡面有哪些事件。那些對應的非同步任務,於是結束等待,進入執行棧,開始執行

4.主執行緒不斷重複第3步

這位大佬講的比我更詳細我就不在這裡贅述了 請移步[juejin.im/post/59e85e…]

相關文章