摘要:事件循環(huán)當進程啟動時,會創(chuàng)建一個循環(huán),每個循環(huán)通過內部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關的回調函數去執(zhí)行,執(zhí)行完以后就進入下一個循環(huán),如果不再有就退出進程。
前言
在學習eventloop之前,我們需要復習一下js的單線程和異步。事件循環(huán)
雖說js是單線程的,但是在瀏覽器和Node中都做了相應的處理。如瀏覽器中的web workers(工作線程),Node中的child_process(子進程)。它們的出現對大量計算的分解起到了促進作用。
當進程啟動時,Node會創(chuàng)建一個tick循環(huán),每個tick循環(huán)通過內部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關的回調函數去執(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("進程結束")
從結果可以看出三種異步處理不阻塞主線程代碼的執(zhí)行,而ajax、fetch、setTimeout根據代碼處理結束的先后來執(zhí)行回調函數。Nodejs中的eventloop
Node中的事件循環(huán)根據觀察者的優(yōu)先級來執(zhí)行,同一個循環(huán)內的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í)行")總結
事件循環(huán)的執(zhí)行特點,源于利用單線程,遠離多線程死鎖、狀態(tài)同步等問題;利用異步讓單線程遠離阻塞,以更好的使用CPU。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/52909.html
摘要:事件循環(huán)當進程啟動時,會創(chuàng)建一個循環(huán),每個循環(huán)通過內部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關的回調函數去執(zhí)行,執(zhí)行完以后就進入下一個循環(huán),如果不再有就退出進程。 前言 在學習eventloop之前,我們需要復習一下js的單線程和異步。雖說js是單線程的,但是在瀏覽器和Node中都做了相應的處理。如瀏覽器中的web workers(工作線程),Node中的child_...
摘要:事件循環(huán)當進程啟動時,會創(chuàng)建一個循環(huán),每個循環(huán)通過內部的觀察者來查看是否有事件需要處理,如果有就取出事件和它相關的回調函數去執(zhí)行,執(zhí)行完以后就進入下一個循環(huán),如果不再有就退出進程。 前言 在學習eventloop之前,我們需要復習一下js的單線程和異步。雖說js是單線程的,但是在瀏覽器和Node中都做了相應的處理。如瀏覽器中的web workers(工作線程),Node中的child_...
摘要:隨著狀態(tài)發(fā)生變化,相應的產生。這些被轉發(fā)到中的來采取相應的操作。當收到數據或相關的狀態(tài)改變時,這些方法被調用,這些方法和的生命周期密切相關。主要由一系列組成的。采用的線程模型,在同一個線程的中處理所有發(fā)生的事。 「博客搬家」 原地址: 簡書 原發(fā)表時間: 2017-05-05 學習了一段時間的 Netty,將重點與學習心得總結如下,本文主要總結ChannelHandler 及 E...
摘要:現實中是這樣的執(zhí)行結果為結果告訴我們,是單線程沒錯,不過不是逐行同步執(zhí)行。搜索了很多官方個人博客得到了一堆詞引擎主線程事件表事件隊列宏任務微任務,徹底懵逼。。。以此規(guī)則不停的執(zhí)行下去就是我們所聽到的事件循環(huán)。 都知道javascript是單線程,那么問題來了,既然是單線程順序執(zhí)行,那怎么做到異步的呢? 我們理解的單線程應該是這樣的,排著一個個來,是同步執(zhí)行。 showImg(https...
閱讀 3026·2021-11-12 10:36
閱讀 4756·2021-09-22 10:57
閱讀 1570·2021-09-22 10:53
閱讀 2658·2019-08-30 15:55
閱讀 3499·2019-08-29 17:00
閱讀 3356·2019-08-29 16:36
閱讀 2470·2019-08-29 13:46
閱讀 1351·2019-08-26 11:45