js 事件迴圈機制 EventLoop

2022-08-27 02:39:14 字數 1086 閱讀 7199

js 的非阻塞i/o  就是由事件迴圈機制實現的

眾所周知  js是單執行緒的 也就是上乙個任務完成後才能開始新的任務 

那js碰到ajxa和定時器、promise這些非同步任務怎麼辦那?這時候就出現了事件佇列。

js的主要執行棧 稱為主棧

用ajax舉例:

**執行的時候如果遇到ajax怎麼辦,ajax事件的實現 是瀏覽器上的乙個功能或者說是執行緒,當js主棧執行到ajax事件,js會告訴瀏覽器讓瀏覽器去請求,然後js主棧不會去等ajax是否請求成功,js主棧繼續執行,等所有js的同步任務執行完之後,js主棧就會讀取這個「事件佇列」了,把事件佇列裡面的第乙個事件,壓入主棧執行,那麼事件佇列的裡的事件是怎麼來的那?(主線程從"事件佇列"中讀取事件,這個過程是迴圈不斷的,所以整個的這種執行機制又稱為event loop(事件迴圈))

剛才說過js的主棧執行到ajax事件,js會告訴瀏覽器讓瀏覽器去請求,然後瀏覽器請求並且返回結果,那麼那他會把,ajax的**函式放到事件佇列的尾部,ajax完成時間是不定的,如果網路延遲它可能很慢才有結果,這個時候 js的主棧把所有任務都執行完畢了,而且因為ajax沒有返回結果,那麼js主棧的主棧會迴圈不斷的檢視事件佇列裡面有沒有可執行的事件(**函式),也就是說ajax什麼時候返回,js主棧什麼時候執行ajax的**函式。(其他的非同步任務也是一樣的,promise是直接把當前的**函式放到事件佇列裡面)

上面說的事件迴圈機制,就形成為了非阻塞i/o。

下面舉個例子來測試一下吧:

這裡說明下,settimeout()也是瀏覽器上的,他沒有設定時間,但是settimeout()最快執行速度3毫秒(注意這裡說的是最快執行速度)說明他的時間是不準確的。

promise是立刻向事件佇列裡面新增乙個**函式,所以比settimeout快。這也就能解釋他的執行順序了。

剛才我說settimeout 執行時間是不準確的,如果設定settimeout 執行時間是5毫秒,是因為他最後執行完是向事件佇列裡面新增的,如果我的主棧的的**計算量龐大,是10毫秒,那麼你們想想,執行settimeout**的時間不就是10毫秒了嗎?

js事件迴圈機制

1 所有同步任務都在主線程上執行,形成乙個執行棧 execution context stack 2 主線程之外,還存在乙個 任務佇列 task queue 只要非同步任務有了執行結果,就在 任務佇列 之中放置乙個事件。3 一旦 執行棧 中的所有同步任務執行完畢,系統就會讀取 任務佇列 看看裡面有哪...

《理解JS 事件迴圈機制》

從面試題了解事件迴圈機制 第一道 請寫出輸出內容 async function async1 async function async2 console.log script start settimeout function 0 async1 new promise function resolv...

JS 事件迴圈機制(Event Loop)

js事件迴圈機制,最常用到的地方應該是做面試題,經常給出一段 讓你寫出console.log 順序,很傷腦經,死記題目過不久又忘了。了解js事件迴圈機制之後,可以很輕鬆的解決這類題目。js是單執行緒模式,但是又經常聽到 非同步 多執行緒 的概念,js中的 非同步 多執行緒 由事件迴圈機制現的 事件迴...