1. 程式人生 > >setTimeout和Promise的任務隊列

setTimeout和Promise的任務隊列

依靠 必須 結束 永遠 www. 機制 入棧 才會 pro

棧,是指只有在一端進行存取的表結構。可以看做一個打開的箱子,永遠只能對最上面的東西進行操作。也就是先進(棧底)後出(必須把上面的全都拿走),後進(棧頂)先出的順序。

隊列,是指排隊過安檢,先進先出。

在JS的單線程中,任務隊列可以有多個。這些隊列都是依靠函數調用棧來循環執行,這也就是我們常說的事件輪詢。

任務隊列包括宏任務(script全局,setTimeout,setInterval)和微任務(Promise)。

setTimeout和Promise作為任務分發器,將未來需要執行的任務分發到各自隊列中。

Promise在每次事件循環的對尾。

從script(整體代碼)開始第一次循環,全局上下文進入函數調用棧(棧底),如果有可執行代碼就進行正常的入棧出棧,如果有上面提到的setTimeout和Promise,就將任務分發到各自隊列,直到調用棧清空(只剩全局),然後執行所有的微任務隊列(Promise隊列),這就是第一次循環。當所有可執行的微任務執行完畢之後,循環再次從宏任務(setTimeout隊列)開始執行入棧出棧任務分發等,執行完畢,然後再執行所有的微任務,第二次循環結束。。。這樣一直循環下去,直到再也沒有可執行的任務。這就是JS的循環機制。

等到瀏覽器關閉頁面,在棧底的全局上下文才會出棧。

相關閱讀:https://www.tuicool.com/articles/MnY7N3a

https://www.zhihu.com/question/36972010

setTimeout和Promise的任務隊列