js事件循環(huán)機制

基本知識

js是單線程的,只有一個主線程處理邏輯

事件循環(huán)的作用

保證主線程, 有序并高效 或非阻塞 的處理

在js事件中主要分為同步事件(同步任務(wù))與異步事件(異步任務(wù))

同步事件

在主線程中執(zhí)行的任務(wù)

異步事件

只有主線程的執(zhí)行棧為空時才開始執(zhí)行異步任務(wù)舞箍,異步任務(wù)又可進(jìn)一步分為宏任務(wù)與微任務(wù)

宏任務(wù)與微任務(wù)的分類

宏任務(wù):

  • script(整體代碼)
  • setTimeout
  • setInterval
  • setImmediate
  • I/O
  • UI render

微任務(wù):

  • process.nextTick
  • Promise
  • Async
  • MutationObserver

事件循環(huán)運行機制

  1. 首先執(zhí)行同步代碼,遇到宏任務(wù)將其加入宏任務(wù)隊列菇绵,遇到微任務(wù)(微任務(wù)中又存在微任務(wù)會將其就加入到微任務(wù)隊列的隊尾)將其加入微任務(wù)隊列,直到主線程執(zhí)行棧為空
  2. 檢查是否存在微任務(wù)昧港,有則會執(zhí)行至微任務(wù)隊列為空扔罪,然后執(zhí)行下一個宏任務(wù)
  3. 上述過程會不斷重復(fù)始腾,也就是常說的Event Loop(事件循環(huán))。

事件循環(huán)執(zhí)行循序

  • 算上script(整體代碼)宏任務(wù)呕寝,因當(dāng)前主線程執(zhí)行棧為空勋眯,script(整體代碼)中的事件會立即加入到主線程中執(zhí)行


    image.png

動手試一試

  console.log('script start')

    async function async1() {
        await async2()
        console.log('async1 end')
    }
    async function async2() {
        console.log('async2 end')
        return Promise.resolve().then(()=>{
            console.log('async2 end1')
        })
    }
    async1()

    setTimeout(function() {
        console.log('setTimeout1')
        setTimeout(function() {
            console.log('setTimeout3')
        }, 0)
        new Promise(resolve => {
            resolve()
        }).then(function() {
                console.log('promise3')
            })
            .then(function() {
                console.log('promise4')
            })
    }, 0)
    setTimeout(function() {
        console.log('setTimeout2')
    }, 0)

    new Promise(resolve => {
        console.log('Promise')
        resolve()
    })
        .then(function() {
            console.log('promise1')
        })
        .then(function() {
            console.log('promise2')
            setTimeout(()=>{
               console.log("123456")
            },0)
        })

    new Promise(resolve=>{
        resolve()
    }).then(()=>{
        console.log('456789')
    })

    console.log('script end')

相關(guān)資料

并發(fā)模型與事件循環(huán)
js中的宏任務(wù)與微任務(wù)
JS事件循環(huán)機制(event loop)之宏任務(wù)、微任務(wù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末下梢,一起剝皮案震驚了整個濱河市客蹋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怔球,老刑警劉巖嚼酝,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異竟坛,居然都是意外死亡闽巩,警方通過查閱死者的電腦和手機钧舌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涎跨,“玉大人洼冻,你說我怎么就攤上這事∮绾埽” “怎么了撞牢?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叔营。 經(jīng)常有香客問我屋彪,道長,這世上最難降的妖魔是什么绒尊? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任畜挥,我火速辦了婚禮,結(jié)果婚禮上婴谱,老公的妹妹穿的比我還像新娘蟹但。我一直安慰自己,他們只是感情好谭羔,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布华糖。 她就那樣靜靜地躺著,像睡著了一般瘟裸。 火紅的嫁衣襯著肌膚如雪客叉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天景描,我揣著相機與錄音十办,去河邊找鬼。 笑死超棺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呵燕。 我是一名探鬼主播棠绘,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼再扭!你這毒婦竟也來了氧苍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泛范,失蹤者是張志新(化名)和其女友劉穎让虐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罢荡,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赡突,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年对扶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惭缰。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡浪南,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漱受,到底是詐尸還是另有隱情络凿,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布昂羡,位于F島的核電站絮记,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虐先。R本人自食惡果不足惜到千,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赴穗。 院中可真熱鬧憔四,春花似錦、人聲如沸般眉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甸赃。三九已至柿汛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埠对,已是汗流浹背络断。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留项玛,地道東北人貌笨。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像襟沮,于是被迫代替她去往敵國和親锥惋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容