摘要:事件循環(huán)當(dāng)進程啟動時,會創(chuàng)建一個循環(huán),每個循環(huán)通過內(nèi)部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關(guān)的回調(diào)函數(shù)去執(zhí)行,執(zhí)行完以后就進入下一個循環(huán),如果不再有就退出進程。
前言
在學(xué)習(xí)eventloop之前,我們需要復(fù)習(xí)一下js的單線程和異步。事件循環(huán)
雖說js是單線程的,但是在瀏覽器和Node中都做了相應(yīng)的處理。如瀏覽器中的web workers(工作線程),Node中的child_process(子進程)。它們的出現(xiàn)對大量計算的分解起到了促進作用。
當(dāng)進程啟動時,Node會創(chuàng)建一個tick循環(huán),每個tick循環(huán)通過內(nèi)部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關(guān)的回調(diào)函數(shù)去執(zhí)行,執(zhí)行完以后就進入下一個循環(huán),如果不再有就退出進程。
瀏覽器中的eventloop在瀏覽器中把異步事件放到工作線程中,避免阻塞主線程UI的渲染
console.log("進程開始") const ajax = new XMLHttpRequest() ajax.addEventListener("load", () => { console.log("load") }) ajax.addEventListener("loadend", () => { if (ajax.readyState == 4 && ajax.status == 200) { console.log("ajax success") } else { console.log("ajax success") } }) ajax.open("get", "http://localhost/study/html/vue.js") ajax.send() setTimeout(() => { console.log("setTimeout") }, 300) fetch("http://localhost/study/html/demo.json",{ headers: { "content-type": "application/json" } }).then(res => { console.log("fetch") }) let i = 0 while(i < 10000) { i++ } console.log(i) console.log("進程結(jié)束")
從結(jié)果可以看出三種異步處理不阻塞主線程代碼的執(zhí)行,而ajax、fetch、setTimeout根據(jù)代碼處理結(jié)束的先后來執(zhí)行回調(diào)函數(shù)。Nodejs中的eventloop
Node中的事件循環(huán)根據(jù)觀察者的優(yōu)先級來執(zhí)行,同一個循環(huán)內(nèi)的process.nextTick -> setTimeout -> setImmediate
setTimeout(() => { console.log("setTimeout") }, 0) setImmediate(() => { console.log("setImmediate1") process.nextTick(() => { console.log("setImmediate1 插入nextTick") }) }) setImmediate(() => { console.log("setImmediate2") }) process.nextTick(() => { setTimeout(() => { console.log("nextTick1 setTimeout") }, 100) console.log("nextTick1") }) process.nextTick(() => { console.log("nextTick2") }) console.log("正常執(zhí)行")總結(jié)
事件循環(huán)的執(zhí)行特點,源于利用單線程,遠離多線程死鎖、狀態(tài)同步等問題;利用異步讓單線程遠離阻塞,以更好的使用CPU。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108360.html
摘要:事件循環(huán)當(dāng)進程啟動時,會創(chuàng)建一個循環(huán),每個循環(huán)通過內(nèi)部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關(guān)的回調(diào)函數(shù)去執(zhí)行,執(zhí)行完以后就進入下一個循環(huán),如果不再有就退出進程。 前言 在學(xué)習(xí)eventloop之前,我們需要復(fù)習(xí)一下js的單線程和異步。雖說js是單線程的,但是在瀏覽器和Node中都做了相應(yīng)的處理。如瀏覽器中的web workers(工作線程),Node中的child_...
摘要:事件循環(huán)當(dāng)進程啟動時,會創(chuàng)建一個循環(huán),每個循環(huán)通過內(nèi)部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關(guān)的回調(diào)函數(shù)去執(zhí)行,執(zhí)行完以后就進入下一個循環(huán),如果不再有就退出進程。 前言 在學(xué)習(xí)eventloop之前,我們需要復(fù)習(xí)一下js的單線程和異步。雖說js是單線程的,但是在瀏覽器和Node中都做了相應(yīng)的處理。如瀏覽器中的web workers(工作線程),Node中的child_...
摘要:隨著狀態(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...
摘要:現(xiàn)實中是這樣的執(zhí)行結(jié)果為結(jié)果告訴我們,是單線程沒錯,不過不是逐行同步執(zhí)行。搜索了很多官方個人博客得到了一堆詞引擎主線程事件表事件隊列宏任務(wù)微任務(wù),徹底懵逼。。。以此規(guī)則不停的執(zhí)行下去就是我們所聽到的事件循環(huán)。 都知道javascript是單線程,那么問題來了,既然是單線程順序執(zhí)行,那怎么做到異步的呢? 我們理解的單線程應(yīng)該是這樣的,排著一個個來,是同步執(zhí)行。 showImg(https...
閱讀 2740·2023-04-25 22:15
閱讀 1813·2021-11-19 09:40
閱讀 2158·2021-09-30 09:48
閱讀 3231·2021-09-03 10:36
閱讀 2033·2021-08-30 09:48
閱讀 1863·2021-08-24 10:00
閱讀 2735·2019-08-30 15:54
閱讀 710·2019-08-30 15:54