events事件模块是什么,怎么理解
Admin 2022-07-28 群英技术资讯 878 次浏览
这篇文章主要讲解了“events事件模块是什么,怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“events事件模块是什么,怎么理解”吧!
引用官方说明:Node.js 的大部分核心 API 都是围绕惯用的异步事件驱动架构构建的,在该架构中,某些类型的对象(称为"触发器")触发命名事件,使
Function对象("监听器")被调用。
通过对Node的学习及应用,我们知道NodeJS其采用单线程、事件驱动、非阻塞I/O等架构设计,非常适用于高并发、I/O密集型应用。
事件驱动,简单来说就是通过有效方法来监听事件状态的变化,并在发生变化时做出相应的动作。
举一个生活应用的场景来理解:当我们去饭店吃饭点餐,当我们下单之后,服务员告诉我们的订单号(这时候可以理解为注册了一个事件),我们在坐着等候,这时候我们的耳朵就一直监听着服务员的喊号,当喊到我们的时候,我们可以去前台取餐。
NodeJS的事件架构采用经典的--订阅发布模式
订阅发布模式,也可以称之为消息机制,定义了一种依赖关系,这种依赖关系可以理解为 1对N(多个或者单个)观察者们同时监听某一个对象相应的状态变换,一旦变化则通知到所有观察者,从而触发观察者注册的相应事件,该设计模式解决了主体对象与观察者之间功能的耦合。
events模块是NodeJS非常重要的一个模块,在node中大部分的模块的实现都继承了Events类,如fs,http,net等。它提供了一个对象events.EventEmitter,EventEmitter 的核心是事件发射与事件监听器。
简单使用:
import { EventEmitter } from 'events';
class MyEmiter extends EventEmitter{};
const myEmitter = new MyEmiter();
myEmitter.on('hello', () => {
console.log('hello 有人喊你啦');
});
myEmitter.emit('hello');4.1 eventEmitter.on(eventName, callback)
注册监听事件
参数:
4.2 eventEmitter.once(eventName, callback)
可以注册一个监听器,该监听器最多为特定事件调用一次。 一旦事件被触发,则监听器就会被注销然后被调用。
参数:
4.3 eventEmitter.emit(eventName[, ...args])
触发指定的监听事件
参数:
4.4 eventEmitter.removeListener(eventName, callback)
移除指定事件的监听器,注意:该监听器必须是注册过的。否则无效。
参数:
4.5 EventEmitter.removeAllListeners(eventName)
移除所有监听器,一个事件可以有多个监听,需要全部移除时,可以用此方法。
参数:
需要特别注意的是,如果不传参数,将会移除所有的监听事件,比较暴力,建议慎用。
4.6 EventEmitter.listeners(eventName)
返回名为 eventName 的事件的监听器绑定回调函数数组的副本。
4.7 EventEmitter.eventNames()
返回列出触发器已为其注册监听器的事件的数组。
4.8 EventEmitter.setMaxListeners(n)
默认情况下,如果为特定事件添加了 10 个以上的监听器,则 EventEmitter 将打印警告。
emitter.setMaxListeners() 方法允许修改此特定 EventEmitter 实例的限制。 该值可以设置为 Infinity(或 0)以指示无限数量的监听器。
EventEmitter 按照注册的顺序同步地调用所有监听器。这确保了事件的正确排序,并有助于避免竞争条件和逻辑错误。
当 EventEmitter 实例中发生错误时,典型的操作是触发 'error' 事件。 这些在 Node.js 中被视为特殊情况。
如果 EventEmitter 没有为 'error' 事件注册至少一个监听器,并且触发 'error' 事件,则会抛出错误,打印堆栈跟踪,然后退出 Node.js 进程。
作为最佳实践,应始终为 'error' 事件添加监听器。
import { EventEmitter } from 'events';
class MyEmiter extends EventEmitter{};
const myEmitter = new MyEmiter();
myEmitter.on('hello', () => {
console.log('hello 有人喊你啦');
});
myEmitter.on('error', (e) => {
console.log(e)
})
myEmitter.emit('hello');
myEmitter.emit('error', new Error('an error happen'))
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家详细介绍了基于vuex实现购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
目录前言偏函数传参现状封装 partial运行机制拓展 partial柯里化阶段小结前言承接上一篇《XDM,JS如何函数式编程?看这就够了!(一)》,我们知道了函数式编程的几个基本概念。这里作简要回顾:函数式编程目的是为了数据流更加明显,从而代码更具可读性;函数需要一个或多个输入(理想情况下只需一个!)和一个输出,输入
这篇文章主要介绍了JavaScript中时间格式化新思路toLocaleString(),研究Object对象的时候,看到了 toLocaleString() 这个方法可以很简单的实现时间格式化,下面来看看toLocaleString() 的详细内容吧,需要的朋友可以参考一下
我们经常能在一些网站页面上看到圆圈序号列表,也就是带圆圈的需要,这样的序号列表能增加网页的美观性,那么圆圈序号列表怎样用js实现呢?下面就给大家分享一个JS实现彩色圆圈序号列表的实例。
本文我们来了解vant的picker组件的基本用法,下文示例对大家学习picker组件的使用有一定的帮助,需要的朋友可以参考。另外,本文还介绍了vant-ui的Field输入框和Picker结合使用时,如何绑定正确的id类型的值的问题,感兴趣的朋友也可以了解看看。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008