国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

淺談JS和Nodejs中的事件驅(qū)動

瀏覽:112日期:2024-03-29 08:45:34
事件驅(qū)動和發(fā)布-訂閱

事件驅(qū)動架構(gòu)是建立在軟件開發(fā)中一種通用模式上的,這種模式被稱為發(fā)布-訂閱或觀察者模式。

在事件驅(qū)動架構(gòu)中,至少有兩個參與者:主題(subject)和觀察者(observer)。

主題就像調(diào)頻收音機(jī)一樣,向有興趣收聽該主題所說內(nèi)容的觀察者進(jìn)行廣播。

觀察者可能只有一個,也可能有一百個,這都沒有關(guān)系,只要主題有一些要廣播的消息就夠了。

請記住,事件驅(qū)動、發(fā)布-訂閱和觀察者模式在實踐中不是一回事,但在理想情況下,它們使用相同的方法:一個實體廣播一條消息,其他實體偵聽該消息。

發(fā)布-訂閱模式和我一樣老。在 1987 年左右開始理論化,而觀察者模式則出現(xiàn)在 1994 年由“四人幫”所寫的著作《設(shè)計模式》中。

事件驅(qū)動是怎樣用在瀏覽器中的JavaScript的?

借助引擎,JavaScript可以運行在你的瀏覽器中。

最受歡迎的 JavaScript 引擎是 Google Chrome 和 Node.js所使用的V8,F(xiàn)irefox 的 SpiderMonkey 和 Safari/WebKit 使用的 JavaScriptCore。

基于供豐富的環(huán)境,JavaScript 引擎增強(qiáng)了語言,還提供了事件驅(qū)動的 JavaScript 平臺。

實際上,瀏覽器中的 JavaScript 可以與html元素進(jìn)行交互,這些html元素是事件發(fā)送器(event emitters),即能夠發(fā)送事件的對象。

思考一下這個簡單的例子,一個帶有按鈕的 HTML 文檔:

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>What means 'event-driven' in JavaScript?</title></head><body><div> <button id='subscribe'>SUBSCRIBE</button></div></body></html>

如果沒有 JavaScript,則這個按鈕將毫無生命。現(xiàn)在 HTML 按鈕是HTMLButtonElement類型的元素,并且與所有 HTML 元素一樣,它們都連接到EventTarget—— 每個 HTML 元素的共同祖先。

瀏覽器中的事件目標(biāo)是能夠發(fā)出事件的對象:它們是觀察者模式中的主題。

有點混亂?請記住:主題是 FM 廣播,所以任何 HTML 元素都像是廣電臺。

一會兒,你將看到誰是觀察者。

瀏覽器中的主題和觀察者

如果 HTML 元素是主題,那么誰是觀察者?任何注冊為偵聽器的 JavaScript函數(shù)都可以對瀏覽器中的事件做出反應(yīng)。

使用 JavaScript 選擇一個 HTML 元素:

const btn = document.getElementById(’subscribe’);

并使用 addEventListener注冊偵聽器:

const btn = document.getElementById(’subscribe’);btn.addEventListener('click', function () { console.log('Button clicked');});

這里的“click”是事件,按鈕是主題,或者是發(fā)送器,函數(shù)是偵聽器,或者是觀察者。

回顧一下:

HTML 元素是事件發(fā)送器。

JavaScript 中注冊為偵聽器的函數(shù)是觀察者。

所有這些組件構(gòu)成了“一個小小的事件驅(qū)動的體系結(jié)構(gòu)。要測試代碼請保存下面的 HTML 內(nèi)容到文件(或在 Codepen 上嘗試),請單擊按鈕,然后查看瀏覽器的控制臺:

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>What means 'event-driven' in JavaScript?</title></head><body><div> <button id='subscribe'>SUBSCRIBE</button></div></body><script> const btn = document.getElementById(’subscribe’); btn.addEventListener('click', function () {console.log('Button clicked'); });</script></html>

在下一部分中,你將看到用于 Node.js的相同概念。

事件驅(qū)動如何用于 Node.js?

Node.js是用于基于 V8 引擎的運行在瀏覽器之外(命令行工具和服務(wù)器端)的 JavaScript 環(huán)境。

你在 Node.js 中所做的大部分工作都是基于事件的。總會有一個發(fā)送器對象,一些觀察者在監(jiān)聽消息。

在 Node.js 中,沒有任何 HTML 元素,因此大多數(shù)事件都來自進(jìn)程、與網(wǎng)絡(luò)的交互、文件等。

Node.js 中的每個事件發(fā)送器都有一個名為on的方法,該方法至少需要兩個參數(shù):

要偵聽的事件的名稱 監(jiān)聽器函數(shù)

讓我們舉一個實際的例子。看一下這個簡單的 Node.js 服務(wù)器:

const net = require('net');const server = net.createServer().listen(8081, '127.0.0.1');server.on('listening', function () { console.log('Server listening!');});server.on('connection', function (socket) { console.log('Client connected!'); socket.end('Hello client!');});

這段代碼創(chuàng)建了一個監(jiān)聽本地主機(jī)端口 8081 的服務(wù)器。在server 對象上,我們調(diào)用 on 方法來注冊兩個偵聽器函數(shù)。

服務(wù)器啟動后立即觸發(fā)listening事件,而客戶端連接到 127.0.0.1:8081 時將觸發(fā)connection 事件(嘗試一下!)。

在此示例中,server是事件發(fā)送器,主題。另一方面,偵聽器函數(shù)是觀察者。

但是那些on方法從哪里來的呢?

了解 EventEmitter

Node.js 中的所有事件驅(qū)動模塊都擴(kuò)展了一個名為EventEmitter的根類。在我們之前的例子中,來自 net 模塊的網(wǎng)絡(luò)服務(wù)器就使用了 EventEmitter。

Node.js 中的EventEmitter有兩種基本方法:on和emit。

如果你想要與瀏覽器對應(yīng),那么可以把EventEmitter看作是能夠發(fā)出事件的任何一種 HTML 元素。

要在瀏覽器中偵聽事件,請在主題對象上調(diào)用addEventListener:

const btn = document.getElementById(’subscribe’);btn.addEventListener('click', function () { console.log('Button clicked');});

相反,在 Node.js 中有on:

// omitserver.on('listening', () => { console.log('Server listening!');});// omit

準(zhǔn)確地說,Eve​​ntEmitter上還有一個addListener方法。on是它的別名。

EventEmitter還有一個emit方法,在你廣播自定義事件(消息)時很有用。

如果要使用EventEmitter,請從 “events” 模塊中導(dǎo)入并發(fā)出事件:

const EventEmitter = require('events');const emitter = new EventEmitter();emitter.on('customEvent', () => console.log('Got event!'));emitter.emit('customEvent');

用 Node.js 運行代碼,你將在控制臺中看到 “Got event”。

JavaScript 中有關(guān)觀察者/發(fā)布-訂閱的其他示例

JavaScript 沒有對觀察者對象的原生支持,但是有人建議將其添加到語言中。

RxJS是一個將觀察者模式引入 JavaScript 的庫。

Redux是 JavaScript 中發(fā)布-訂閱模式的實現(xiàn)。 這是一個非常好的事件發(fā)送器,其中狀態(tài)的更改會被分發(fā)給所有監(jiān)聽的觀察者。

現(xiàn)代瀏覽器附帶Intersection Observer API,這是觀察者模式的另一個例子。

Socket.IO是一個庫,大量使用了事件。

總結(jié)

希望你從這篇文章中學(xué)到新的東西。你學(xué)到了很多術(shù)語,但最終都?xì)w結(jié)為大約 30 年前發(fā)明的模式:發(fā)布-訂閱。

這種模式,也稱為觀察者,是我們今天在 JavaScript 和 Node.js 中所使用的事件驅(qū)動架構(gòu)的基礎(chǔ)。

再次強(qiáng)調(diào),事件驅(qū)動、發(fā)布-訂閱和觀察者的模式并非完全相同:事件驅(qū)動的體系結(jié)構(gòu)建立在發(fā)布-訂閱之上,觀察者模式比 DOM 和 Node.js 事件更豐富。

但他們都是屬于同一個家庭的成員。

以上就是淺談JS和Nodejs中的事件驅(qū)動的詳細(xì)內(nèi)容,更多關(guān)于JS和Nodejs中的事件驅(qū)動的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 午夜国产亚洲精品一区 | 欧美一级毛片一级毛片 | 国产成人亚洲合集青青草原精品 | 成年免费网站 | 在线黄网 | 亚洲一级网站 | 国产三级在线观看播放 | 成 人 黄 色 免费播放 | 深夜国产成人福利在线观看女同 | 欧美一级欧美三级 | 国产精品成人免费视频 | 欧美一级视频免费看 | 久久精品视频1 | 欧美另类videosbestsex视频 | 目韩一区二区三区系列片丶 | 亚洲精品成人一区二区www | 中国一级毛片视频 | 亚洲精品高清视频 | 无内丝袜透明在线播放 | 日本欧美一区二区三区片 | 日本一级看片免费播放 | 最新国产三级在线观看不卡 | 久久怡红院亚欧成人影院 | 国产免费一区二区三区 | 国产亚洲精品一区二区久久 | 失禁h啪肉尿出来高h | 欧美日韩日本国产 | 国产玖玖在线 | 中文乱码一二三四有限公司 | 久久semm亚洲国产 | 日本欧美一区二区三区在线 | 国产成人性色视频 | 中文字幕在线乱码不卡区区 | 在线视频久 | 最新欧美精品一区二区三区 | 亚洲综合免费视频 | 一级毛片q片 | 九九精品在线视频 | 国产日韩精品视频一区二区三区 | 男人天堂手机在线 | 国产精品视频免费观看调教网 |