這篇文章主要介紹了JavaScript中Event Loop指的是什么,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
目前創(chuàng)新互聯(lián)建站已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、云龍網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
什么是Event Loop?
js的單線程是他的任務(wù)棧是單線程,但他處理異步i/o的方法是依賴libuv開(kāi)啟線程池去處理,完成之后任務(wù)加到poll queue里,然后等任務(wù)棧的任務(wù)為空或事件到達(dá)閥值時(shí),把poll queue和定時(shí)器的任務(wù)加到任務(wù)棧里,繼續(xù)這個(gè)循環(huán),這就是大體上的js的Event Loop。
結(jié)構(gòu)
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<─────┤ connections, │ │ └─────────────┬─────────────┘ │ data, etc. │ │ ┌─────────────┴─────────────┐ └───────────────┘ │ │ check │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ └──┤ close callbacks │ └───────────────────────────┘
timer:
定時(shí)任務(wù),當(dāng)?shù)竭_(dá)閥值時(shí),他不會(huì)立即執(zhí)行,會(huì)等待任務(wù)棧的任務(wù)會(huì)阻塞他。
pending callbacks:
此階段執(zhí)行某些系統(tǒng)操作(例如TCP錯(cuò)誤類型)的回調(diào)。例如,如果TCP套接字在嘗試連接時(shí)收到,則某些*nix系統(tǒng)希望等待報(bào)告錯(cuò)誤。這將排隊(duì)等待在掛起的回調(diào)階段執(zhí)行。
pull:
這個(gè)階段有兩個(gè)主要功能:
計(jì)算它應(yīng)該阻塞和輪詢I / O的時(shí)間,然后
處理輪詢隊(duì)列中的事件。
當(dāng)事件循環(huán)進(jìn)入輪詢階段并且沒(méi)有計(jì)劃定時(shí)器時(shí),將發(fā)生以下兩種情況之一:
如果輪詢隊(duì)列不為空,則事件循環(huán)將遍歷其同步執(zhí)行它們的回調(diào)隊(duì)列,直到隊(duì)列已用盡,或者達(dá)到系統(tǒng)相關(guān)的硬限制。
如果輪詢隊(duì)列為空,則會(huì)發(fā)生以下兩種情況之一:
如果腳本已執(zhí)行setImmediate,則事件循環(huán)將結(jié)束poll階段并繼續(xù)執(zhí)行check階段以執(zhí)行這些調(diào)度腳本。
如果腳本沒(méi)有執(zhí)行setImmediate,事件循環(huán)將等待回調(diào)被添加到poll queue中,然后立即執(zhí)行。
一旦poll queue為空事件循環(huán)將檢查timer,如果一個(gè)或多個(gè)定時(shí)器準(zhǔn)備就緒,事件循環(huán)將回繞到timer階段以執(zhí)行那些timer的回調(diào)。
check
此階段允許人員在輪詢階段完成后立即執(zhí)行回調(diào) 。如果輪詢階段變?yōu)榭臻e并且存在setImmediate任務(wù),那么事件循環(huán)直接跳到check執(zhí)行而不是阻塞在poll階段等待回調(diào)被加入。
setImmediate實(shí)際上是一個(gè)特殊的計(jì)時(shí)器,它在事件循環(huán)的一個(gè)單獨(dú)階段運(yùn)行。它使用libuv API來(lái)調(diào)度在輪詢階段完成后執(zhí)行的回調(diào)。
close callbacks
如果socket或handle突然關(guān)閉(例如socket.destroy()),則該 'close'事件將在此階段發(fā)出。否則它將通過(guò)發(fā)射process.nextTick()。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享JavaScript中Event Loop指的是什么內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問(wèn)題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!