這兩天看了 Event Loop 相關的技術文章,寫了一個測試代碼,發現測試結果并不穩定,可能會因為一些變量而導致不同的結果。不知道是瀏覽器實現的問題還是測試代碼的問題。參考技術文章為了后面方便引用,給參考文章加上編號JavaScript 運行機制詳解:再談Event Loop - $RYF并發模型與Event Loop - MDN - $MDN首先貼代碼:測試環境Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3041.0 Safari/537.36運行了很多次,把比較典型的三種結果貼出來:我的具體問題:第二個<script>標簽中的同步代碼的執行結果為什么排在異步回調之后?$RYF 文章中第四章講到:執行棧中的代碼(同步任務),總是在讀取"任務隊列"(異步任務)之前執行。setTimeout()的回調函數為什么會在主進程(另外一個<script>標簽中的同步代碼)和異步任務(XHR請求 jQuery 文件)之前調用?$RYF 文章中第五章講到:setTimeout(fn,0)的含義是,指定某個任務在主線程最早可得的空閑時間執行,也就是說,盡可能早得執行。它在"任務隊列"的尾部添加一個事件,因此要等到同步任務和"任務隊列"現有的事件都處理完,才會得到執行。$MDN 中的 事件循環 -> 添加消息 段落講到:調用 setTimeout 函數會在一個時間段過去后在隊列中添加一個消息。這個時間段作為函數的第二個參數被傳入。如果隊列中沒有其它消息,消息會被馬上處理。難道測試結果二和三種,setTimeout()的回調函數出現在XHR的回調函數之前是因為當時消息隊列中為空嗎?往消息隊列中添加消息是在事件觸發的時候嘛?例如,通過XHR請求 jQuery 資源,待 jQuery 文件加載完成會觸發“加載完成事件”,這時候會在消息隊列中添加一個消息,等待主進程讀取并調用對應的回調函數。為什么 jQuery 資源加載時間的變化,會引起另外一個<script>標簽中的同步代碼、XHR的回調以及setTimeout()方法的回調,這三段代碼執行先后的變化?如有描述錯誤地方,請指正。。
Event Loop 中異步任務的疑問? ???
烙印99
2018-11-07 13:15:47
