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