最近看了一些文章對於async await的原理及概念的解析,我覺得很多時候有些不太准確。
尤其是對於async和await會阻塞線程的說法更是有些扯淡了,JS本身就是單線程的語言如果await會阻塞線程那不是說JS自己搬石頭砸自己的腳?
用最簡單的話去描述
在node中執行一個文件,或處理一個HTTP請求,這個時候js會將同步任務與異步任務區分,如果是同步任務將會被推入執行棧交由主線程執行。
如果是異步任務將被扔到事件表當中,當異步任務執行完畢將會被推入事件隊列當中,等主線程將同步任務執行完畢后。
將會執行事件隊列中的異步任務,其中又分為宏任務與微任務。
當事件隊列中沒有執行完畢的異步任務,主線程將會處理下一個http請求,再次進入這樣的循環,處理同步任務,查看事件隊列中是否有執行完畢的異步任務。
如果在執行時遇到async await
那么會將awiat后的代碼丟入事件表,並對當前函數進行壓棧
也就是跳過當前函數執行下面主線程中的代碼 當主線程同步任務執行完畢后,會按照node原本的機制執行事件隊列中的異步任務
這個時候如果awiat后的表達式或異步任務已經執行完畢,那么會將其所在的函數進行出棧,執行。
那么問題來了,這其中有所謂的阻塞I/O嗎?沒有,那么為什么要說這些誤導大家呢?要知道node是非阻塞I/O模型,如果I/O阻塞那node還要不要玩了?
下面這張圖是event loop循環的過程。