电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺談JS和Nodejs中的事件驅動

瀏覽:114日期:2024-03-29 08:45:34
事件驅動和發布-訂閱

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

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

主題就像調頻收音機一樣,向有興趣收聽該主題所說內容的觀察者進行廣播。

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

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

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

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

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

最受歡迎的 JavaScript 引擎是 Google Chrome 和 Node.js所使用的V8,Firefox 的 SpiderMonkey 和 Safari/WebKit 使用的 JavaScriptCore。

基于供豐富的環境,JavaScript 引擎增強了語言,還提供了事件驅動的 JavaScript 平臺。

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

思考一下這個簡單的例子,一個帶有按鈕的 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,則這個按鈕將毫無生命。現在 HTML 按鈕是HTMLButtonElement類型的元素,并且與所有 HTML 元素一樣,它們都連接到EventTarget—— 每個 HTML 元素的共同祖先。

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

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

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

瀏覽器中的主題和觀察者

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

使用 JavaScript 選擇一個 HTML 元素:

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

并使用 addEventListener注冊偵聽器:

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

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

回顧一下:

HTML 元素是事件發送器。

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

所有這些組件構成了“一個小小的事件驅動的體系結構。要測試代碼請保存下面的 HTML 內容到文件(或在 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的相同概念。

事件驅動如何用于 Node.js?

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

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

在 Node.js 中,沒有任何 HTML 元素,因此大多數事件都來自進程、與網絡的交互、文件等。

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

要偵聽的事件的名稱 監聽器函數

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

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!');});

這段代碼創建了一個監聽本地主機端口 8081 的服務器。在server 對象上,我們調用 on 方法來注冊兩個偵聽器函數。

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

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

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

了解 EventEmitter

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

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

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

要在瀏覽器中偵聽事件,請在主題對象上調用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

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

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

如果要使用EventEmitter,請從 “events” 模塊中導入并發出事件:

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

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

JavaScript 中有關觀察者/發布-訂閱的其他示例

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

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

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

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

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

總結

希望你從這篇文章中學到新的東西。你學到了很多術語,但最終都歸結為大約 30 年前發明的模式:發布-訂閱。

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

再次強調,事件驅動、發布-訂閱和觀察者的模式并非完全相同:事件驅動的體系結構建立在發布-訂閱之上,觀察者模式比 DOM 和 Node.js 事件更豐富。

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

以上就是淺談JS和Nodejs中的事件驅動的詳細內容,更多關于JS和Nodejs中的事件驅動的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 楼承板-开闭口楼承板-无锡海逵楼承板| 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 上海诺狮景观规划设计有限公司 | 400电话_400电话申请_866元/年_【400电话官方业务办理】-俏号网 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 【黄页88网】-B2B电子商务平台,b2b平台免费发布信息网 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 南京试剂|化学试剂|分析试剂|实验试剂|cas号查询-专业60年试剂销售企业 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 天然鹅卵石滤料厂家-锰砂滤料-石英砂滤料-巩义东枫净水 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 查分易-成绩发送平台官网 | 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 铸钢件厂家-铸钢齿轮-减速机厂家-淄博凯振机械有限公司 | Type-c防水母座|贴片母座|耳机接口|Type-c插座-深圳市步步精科技有限公司 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 硬度计,金相磨抛机_厂家-莱州华煜众信试验仪器有限公司 | 书信之家_书信标准模板范文大全| 外观设计_设备外观设计_外观设计公司_产品外观设计_机械设备外观设计_东莞工业设计公司-意品深蓝 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | 湖南长沙商标注册专利申请,长沙公司注册代理记账首选美创! | 环氧树脂地坪漆_济宁市新天地漆业有限公司 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 物流公司电话|附近物流公司电话上门取货 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 篮球架_乒乓球台_足球门_校园_竞技体育器材_厂家_价格-沧州浩然体育器材有限公司 | 成都思迪机电技术研究所-四川成都思迪编码器 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 口信网(kousing.com) - 行业资讯_行业展会_行业培训_行业资料 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 |