摘要:瀏覽器中的與中的之前是不一樣,之后,與瀏覽器一樣單線程存在的問題是單線程的,處理任務(wù)是一件接著一件處理,所以如果一個(gè)任務(wù)需要處理很久的話,后面的任務(wù)就會(huì)被阻塞所以通過事件循環(huán)的方式解決了這個(gè)問題在了解事件循環(huán)前,我們需要了解一些關(guān)鍵詞什么是
瀏覽器中的eventLoop 與node中的eventLoop
node11之前是不一樣,node11之后,與瀏覽器一樣
js單線程存在的問題js是單線程的,處理任務(wù)是一件接著一件處理,所以如果一個(gè)任務(wù)需要處理很久的話,后面的任務(wù)就會(huì)被阻塞
所以js通過Event Loop事件循環(huán)的方式解決了這個(gè)問題,在了解事件循環(huán)前,我們需要了解一些關(guān)鍵詞
什么是stack,queue,heap,event loopstack(棧):先進(jìn)后出
queue(隊(duì)列)先進(jìn)先出
heap(堆):存儲(chǔ)obj對(duì)象
Event Loop的具體流程堆里面有同步和異步的方法
這些方法,放到棧里,棧是先進(jìn)后出的執(zhí)行
同步的話一個(gè)一個(gè)的執(zhí)行,碰到異步的方法,也會(huì)執(zhí)行,但是不會(huì)執(zhí)行完,而是先交給webapis處理,多個(gè)異步,會(huì)形成一個(gè)隊(duì)列,先進(jìn)先出
等到同步的方法執(zhí)行完后,把wepapi中的異步方法取出來,放到棧中執(zhí)行
上面的代碼最后輸出1,5,2,4,3,執(zhí)行過程:
只有console.log(2)執(zhí)行完成,執(zhí)行棧再次清空時(shí),才會(huì)從回調(diào)隊(duì)列取出console.log(3)
1,輸出1,將2push進(jìn)回調(diào)隊(duì)列
2,將4push進(jìn)回調(diào)隊(duì)列
3,輸出5
4,清空了執(zhí)行棧,讀取輸出2,發(fā)現(xiàn)有3,將3push進(jìn)回調(diào)隊(duì)列
5,清空了執(zhí)行棧,讀取輸出4
6,清空了執(zhí)行棧,讀取輸出3
Macrotask(宏任務(wù))、Microtask(微任務(wù))Microtask(微任務(wù))雖然是隊(duì)列,但并不是一個(gè)一個(gè)放入執(zhí)行棧,而是當(dāng)執(zhí)行棧請(qǐng)空,會(huì)執(zhí)行全部
Microtask(微任務(wù))隊(duì)列中的任務(wù),最后才是取回調(diào)隊(duì)列的第一個(gè)Macrotask(宏任務(wù))
···
···
上面的執(zhí)行過程是:
1,將setTimeout給push進(jìn)宏任務(wù)
2,將then(2)push進(jìn)微任務(wù)
3,將then(4)push進(jìn)微任務(wù)
4,任務(wù)隊(duì)列為空,取出微任務(wù)第一個(gè)then(2)壓入執(zhí)行棧
5,輸出2,將then(3)push進(jìn)微任務(wù)
6,任務(wù)隊(duì)列為空,取出微任務(wù)第一個(gè)then(4)壓入執(zhí)行棧
7,輸出4
8,任務(wù)隊(duì)列為空,取出微任務(wù)第一個(gè)then(3)壓入執(zhí)行棧
9,輸出3
10,任務(wù)隊(duì)列為空,微任務(wù)也為空,取出宏任務(wù)中的setTimeout(1)
11,輸出1
https://juejin.im/post/5a6309...
https://github.com/Advanced-F...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103813.html
摘要:事件循環(huán)當(dāng)進(jìn)程啟動(dòng)時(shí),會(huì)創(chuàng)建一個(gè)循環(huán),每個(gè)循環(huán)通過內(nèi)部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關(guān)的回調(diào)函數(shù)去執(zhí)行,執(zhí)行完以后就進(jìn)入下一個(gè)循環(huán),如果不再有就退出進(jìn)程。 前言 在學(xué)習(xí)eventloop之前,我們需要復(fù)習(xí)一下js的單線程和異步。雖說js是單線程的,但是在瀏覽器和Node中都做了相應(yīng)的處理。如瀏覽器中的web workers(工作線程),Node中的child_...
摘要:事件循環(huán)當(dāng)進(jìn)程啟動(dòng)時(shí),會(huì)創(chuàng)建一個(gè)循環(huán),每個(gè)循環(huán)通過內(nèi)部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關(guān)的回調(diào)函數(shù)去執(zhí)行,執(zhí)行完以后就進(jìn)入下一個(gè)循環(huán),如果不再有就退出進(jìn)程。 前言 在學(xué)習(xí)eventloop之前,我們需要復(fù)習(xí)一下js的單線程和異步。雖說js是單線程的,但是在瀏覽器和Node中都做了相應(yīng)的處理。如瀏覽器中的web workers(工作線程),Node中的child_...
摘要:事件循環(huán)當(dāng)進(jìn)程啟動(dòng)時(shí),會(huì)創(chuàng)建一個(gè)循環(huán),每個(gè)循環(huán)通過內(nèi)部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關(guān)的回調(diào)函數(shù)去執(zhí)行,執(zhí)行完以后就進(jìn)入下一個(gè)循環(huán),如果不再有就退出進(jìn)程。 前言 在學(xué)習(xí)eventloop之前,我們需要復(fù)習(xí)一下js的單線程和異步。雖說js是單線程的,但是在瀏覽器和Node中都做了相應(yīng)的處理。如瀏覽器中的web workers(工作線程),Node中的child_...
摘要:引言學(xué)習(xí)的時(shí)候,經(jīng)常聽人說,即是異步的,又是單線程的。所以我們說是異步單線程的。參考從瀏覽器多進(jìn)程到單線程,運(yùn)行機(jī)制最全面的一次梳理運(yùn)行機(jī)制詳解再談異步機(jī)制詳解運(yùn)行原理解析并發(fā)模型與事件循環(huán) showImg(https://segmentfault.com/img/bVbo4hv?w=1800&h=1000); 引言 學(xué)習(xí)javascipt的時(shí)候,經(jīng)常聽人說,javascipt即是異步...
摘要:隨著狀態(tài)發(fā)生變化,相應(yīng)的產(chǎn)生。這些被轉(zhuǎn)發(fā)到中的來采取相應(yīng)的操作。當(dāng)收到數(shù)據(jù)或相關(guān)的狀態(tài)改變時(shí),這些方法被調(diào)用,這些方法和的生命周期密切相關(guān)。主要由一系列組成的。采用的線程模型,在同一個(gè)線程的中處理所有發(fā)生的事。 「博客搬家」 原地址: 簡書 原發(fā)表時(shí)間: 2017-05-05 學(xué)習(xí)了一段時(shí)間的 Netty,將重點(diǎn)與學(xué)習(xí)心得總結(jié)如下,本文主要總結(jié)ChannelHandler 及 E...
閱讀 3402·2023-04-26 01:46
閱讀 2932·2023-04-25 20:55
閱讀 5509·2021-09-22 14:57
閱讀 2989·2021-08-27 16:23
閱讀 1726·2019-08-30 14:02
閱讀 2077·2019-08-26 13:44
閱讀 656·2019-08-26 12:08
閱讀 2976·2019-08-26 11:47