事件驱动如何用于浏览器中的JS及Node.js
Admin 2022-07-19 群英技术资讯 354 次浏览
事件驱动架构是建立在软件开发中一种通用模式上的,这种模式被称为发布-订阅或观察者模式。
在事件驱动架构中,至少有两个参与者:主题(subject)和观察者(observer)。
主题就像调频收音机一样,向有兴趣收听该主题所说内容的观察者进行广播。
观察者可能只有一个,也可能有一百个,这都没有关系,只要主题有一些要广播的消息就够了。
请记住,事件驱动、发布-订阅和观察者模式在实践中不是一回事,但在理想情况下,它们使用相同的方法:一个实体广播一条消息,其他实体侦听该消息。
发布-订阅模式和我一样老。在 1987 年左右开始理论化,而观察者模式则出现在 1994 年由“四人帮”所写的著作《设计模式》中。
借助引擎,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是用于基于 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方法从哪里来的呢?
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:
// omit server.on("listening", () => { console.log("Server listening!"); }); // omit
准确地说,EventEmitter上还有一个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 没有对观察者对象的原生支持,但是有人建议将其添加到语言中。
RxJS是一个将观察者模式引入 JavaScript 的库。
Redux是 JavaScript 中发布-订阅模式的实现。 这是一个非常好的事件发送器,其中状态的更改会被分发给所有监听的观察者。
现代浏览器附带Intersection Observer API,这是观察者模式的另一个例子。
Socket.IO是一个库,大量使用了事件。
希望你从这篇文章中学到新的东西。你学到了很多术语,但最终都归结为大约 30 年前发明的模式:发布-订阅。
这种模式,也称为观察者,是我们今天在 JavaScript 和 Node.js 中所使用的事件驱动架构的基础。
再次强调,事件驱动、发布-订阅和观察者的模式并非完全相同:事件驱动的体系结构建立在发布-订阅之上,观察者模式比 DOM 和 Node.js 事件更丰富。
但他们都是属于同一个家庭的成员。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享用JS怎样实现鼠标小尾巴的特效的内容,实现原理其实并不困难,本文有代码供大家参考,感兴趣的朋友可以参考,接下来跟随小编一起来了解看看吧。
目前Nodejs开发中有很多痛点,其中有一个是修改完代码以后需要我们重启服务才能看到效果。这样一次次的杀进程、重启,杀进程、重启很让人头大。程序员是最痛恨重复工作的物种,之前有了解过的同学可能知道 forever 。 forever 可以帮我们解决上面的问题,通过对资源变化的检测做到变化后自动重启。开发阶段我们使用 nodefile.js 来启动另外由于Nodejs的单线程,任何异常都会导致整个
这篇文章给大家分享的是jQuery怎么取消hover事件的方法。在实际的项目中,我们常常需要用jquery去响应鼠标的hover事件,所以掌握绑定和取消hover事件是很基础的,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
目录累加/累积求最大/最小值格式化搜索参数反序列化搜索参数拉平嵌套数组实现 flat数组去重数组计数获取对象多个属性反转字符串不知道大家平常用 Reduce 多不多,反正本瓜用
这篇文章主要为大家详细介绍了JavaScript canvas实现刮刮乐案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008