摘要:基本上所有都事件機(jī)制都是通過觀察者模式實(shí)現(xiàn)單線程類似進(jìn)入一個(gè)事件循環(huán),直到?jīng)]有事件觀察者退出,每個(gè)異步事件都生成一個(gè)事件觀察者,如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù)。
Node.js事件循環(huán)
Node.js 是單進(jìn)程單線程應(yīng)用程序,但是因?yàn)閂8引擎提供的異步執(zhí)行回調(diào)接口,通過這些接口可以處理大量的并發(fā),所以性能非常高。
Node.js 幾乎每一個(gè)API都支持回調(diào)函數(shù)。
Node.js 基本上所有都事件機(jī)制都是通過觀察者模式實(shí)現(xiàn)
Node.js 單線程類似進(jìn)入一個(gè)while(true)事件循環(huán),直到?jīng)]有事件觀察者退出,每個(gè)異步事件都生成一個(gè)事件觀察者,
如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù)。
事件驅(qū)動(dòng)程序
Node.js 使用事件驅(qū)動(dòng)模型,當(dāng)web server接收到請求,就把它關(guān)閉然后進(jìn)行處理,然后去服務(wù)下一個(gè)web請求。
當(dāng)這個(gè)請求完成,它被放回處理隊(duì)列,當(dāng)?shù)竭_(dá)隊(duì)列開頭,這個(gè)結(jié)果被返回給用戶。
這個(gè)模型非常高效可擴(kuò)展性非常強(qiáng),因?yàn)閣ebserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅(qū)動(dòng)IO)
在事件驅(qū)動(dòng)模型中,會(huì)生成一個(gè)主循環(huán)來監(jiān)聽事件,當(dāng)檢測到事件時(shí)觸發(fā)回調(diào)函數(shù)。
//引入events const events = require("events") // 創(chuàng)建eventEmitter對象 const eventEmitter = new events.EventEmitter(); // 創(chuàng)建時(shí)間處理程序 var connectHandler = function connected (){ console.log("連接成功") // 出發(fā)data_received事件 eventEmitter.emit("data_received") } // 綁定connection事件處理程序 eventEmitter.on("connection", connectHandler) // 使用匿名函數(shù)綁定data_received事件 eventEmitter.on("data_received",() => { console.log("數(shù)據(jù)接收成功。") }) // 觸發(fā)connection事件 eventEmitter.emit("connection") console.log("程序執(zhí)行完畢")
Node應(yīng)用程序是如何工作的 ??
在Node應(yīng)用程序中,執(zhí)行異步操作都函數(shù)將回調(diào)函數(shù)作為最后一個(gè)參數(shù),回調(diào)函數(shù)接收錯(cuò)誤對象做一個(gè)第一個(gè)參數(shù)。
const fs = require("fs") fs.readFile("input.txt",(err,data) => { if(err) { console.log(err) }else{ console.log(data.toString()) } }) console.log("程序執(zhí)行結(jié)束!")
這段代碼,input.txt文件我給刪除了,所以在執(zhí)行過程中,發(fā)生錯(cuò)誤,錯(cuò)誤err對象就會(huì)輸出錯(cuò)誤信息。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/53981.html
摘要:事件處理器,則是當(dāng)指定事件觸發(fā)時(shí),執(zhí)行的一段代碼。事件循環(huán)以一個(gè)無限循環(huán)的形式啟動(dòng),存在于二進(jìn)制文件里函數(shù)的最后,當(dāng)沒有更多可被執(zhí)行的事件處理器時(shí),它就退出。 前言 如果你了解過Node.js,那么你一定聽說過事件循環(huán)。你一定想知道它為什么那么特殊,并且為什么你需要關(guān)注它?此時(shí)此刻的你,可能已經(jīng)寫過許多基于Express.js的后端代碼,但沒有接觸到任何的循環(huán)。 在下文中,我們會(huì)先在一...
摘要:輪詢投票處理下一次處理的新事件立即設(shè)置運(yùn)行通過注冊的所有回調(diào)關(guān)閉執(zhí)行所有的回調(diào)工作處理延遲此度量標(biāo)準(zhǔn)測量線程池處理異步任務(wù)需要多長時(shí)間。高工作時(shí)間處理延遲表明繁忙耗盡的線程池。 原文=> What you should know to really understand the Node.js Event Loop Node.js 是一個(gè)基于事件的平臺。這就意味著在Node中發(fā)生的所...
摘要:檢索新的事件執(zhí)行與相關(guān)的回調(diào)幾乎所有,除了由定時(shí)器調(diào)度的一些和將在適當(dāng)?shù)臅r(shí)候在這里阻塞。在事件循環(huán)的每次運(yùn)行之間,檢查它是否在等待任何異步或定時(shí)器,如果沒有,則徹底關(guān)閉。 Node.js事件循環(huán)、定時(shí)器和process.nextTick() 什么是事件循環(huán)? 事件循環(huán)允許Node.js執(zhí)行非阻塞I/O操作 — 盡管JavaScript是單線程的 — 通過盡可能將操作卸載到系統(tǒng)內(nèi)核。 ...
摘要:前沿是基于引擎的運(yùn)行環(huán)境具有事件驅(qū)動(dòng)非阻塞等特點(diǎn)結(jié)合具有網(wǎng)絡(luò)編程文件系統(tǒng)等服務(wù)端的功能用庫進(jìn)行異步事件處理線程的單線程含義實(shí)際上說的是執(zhí)行同步代碼的主線程一個(gè)程序的啟動(dòng)不止是分配了一個(gè)線程,而是我們只能在一個(gè)線程執(zhí)行代碼當(dāng)出現(xiàn)資源調(diào)用連接等 前沿 Node.js 是基于V8引擎的javascript運(yùn)行環(huán)境. Node.js具有事件驅(qū)動(dòng), 非阻塞I/O等特點(diǎn). 結(jié)合Node API, ...
js異步歷史 一個(gè) JavaScript 引擎會(huì)常駐于內(nèi)存中,它等待著我們把JavaScript 代碼或者函數(shù)傳遞給它執(zhí)行 在 ES3 和更早的版本中,JavaScript 本身還沒有異步執(zhí)行代碼的能力,引擎就把代碼直接順次執(zhí)行了,異步任務(wù)都是宿主環(huán)境(瀏覽器)發(fā)起的(setTimeout、AJAX等)。 在 ES5 之后,JavaScript 引入了 Promise,這樣,不需要瀏覽器的安排,J...
摘要:的單線程,與它的用途有關(guān)。特點(diǎn)的顯著特點(diǎn)異步機(jī)制事件驅(qū)動(dòng)。隊(duì)列的讀取輪詢線程,事件的消費(fèi)者,的主角。它將不同的任務(wù)分配給不同的線程,形成一個(gè)事件循環(huán),以異步的方式將任務(wù)的執(zhí)行結(jié)果返回給引擎。 這兩天跟同事同事討論遇到的一個(gè)問題,js中的event loop,引出了chrome與node中運(yùn)行具有setTimeout和Promise的程序時(shí)候執(zhí)行結(jié)果不一樣的問題,從而引出了Nodejs的...
閱讀 1418·2021-09-22 15:52
閱讀 1458·2019-08-30 15:44
閱讀 895·2019-08-30 14:24
閱讀 2705·2019-08-30 13:06
閱讀 2700·2019-08-26 13:45
閱讀 2782·2019-08-26 13:43
閱讀 1015·2019-08-26 12:01
閱讀 1436·2019-08-26 11:56