iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > 其他 >浅析Node的events模块
  • 896
分享到

浅析Node的events模块

nodejsnode 2023-05-14 22:05:56 896人浏览 薄情痞子
摘要

在 Vue 的项目中,有时我们会用到全局事件总线来管理组件之间的通信。vue2 项目里我们可以自己借助 $emit、 $on 和 $off 封装一个 eventHub;vue3 中 $on 和 $off 被移除了,我们可以使用 mitt 库

浅析Node的events模块

Vue项目中,有时我们会用到全局事件总线来管理组件之间的通信。vue2 项目里我们可以自己借助 $emit$on$off 封装一个 eventHubvue3$on$off 被移除了,我们可以使用 mitt 库或 tiny-emitter 库。在 node 里,则不用这么麻烦,其有个内置的 events 模块就可以帮我们实现对于事件的监听和发射。

事件的监听和发射

先使用 Commonjs 的语法导入得到 EventEmitter 类,然后生成实例 emitterEventEmitter 十分重要,比如后续文章会介绍的 stream 就是 EventEmitter 的实例):

const EventEmitter = require('events')
const emitter = new EventEmitter()

接着就可以使用 emitter.on() 对事件进行监听,传入的第 1 个参数就是事件名称,第 2 个参数为监听到事件被发射后要执行的回调,如果发射事件时有传入参数,会传递给回调函数,可以一个个单独获取,也可以像下面这样使用函数的剩余参数获取: 【相关教程推荐:nodejs视频教程、编程教学】

// 监听事件
emitter.on('test', (...args) => {
  console.log(args) // [ 1, 2, 3 ]
})
// 发射事件
emitter.emit('test', 1, 2, 3)

如果只需要监听一次性事件,可以使用 emitter.once()

emitter.once('test', () => {
  console.log('监听到了事件发射')
})

emitter.emit('test')
emitter.emit('test') // 本次发射不会触发打印

如果有多个地方如下例所示对事件进行了监听,一旦事件发射,那么监听回调会按顺序依次触发:

emitter.on('test', () => {
  console.log('监听到了事件发射,1')
})
emitter.on('test', () => {
  console.log('监听到了事件发射,2')
})
emitter.emit('test')

执行结果:

1.png

如果想把监听事件添加到最前面,可以使用 emitter.prependListener()(或者 emitter.prependOnceListener(),即提前但只监听一次):

emitter.on('test', () => {
  console.log('监听到了事件发射,1')
})
emitter.prependListener('test', () => {
  console.log('监听到了事件发射,2')
})

emitter.emit('test')

现在的结果如下:

2.png

移除事件监听

可以使用 emitter.off()(或者 emitter.removeListener())移除对事件的监听,但需要传入对应的事件名称和回调函数,所以我们在监听时的回调就不能直接像上面这样定义在 emitter.on() 内部了,需要在外部定义然后传入对该回调的引用:

function handler(...args) {
  console.log(args) // [ 1, 2, 3 ]
}
emitter.on('test', handler)
emitter.emit('test', 1, 2, 3) 
emitter.off('test', handler)
emitter.emit('test', '无法被监听到')

emitter.off()只能移除一个监听,且必须传入监听回调,如果有多次监听,想全部移除,可以使用 emitter.removeAllListeners()

emitter.on('test', handler)
emitter.on('test', handler)
emitter.on('test', handler)

emitter.removeAllListeners()

emitter.removeAllListeners()如果不传入任何参数,则移除所有事件名称的所有事件监听。其还可以传入事件名称,则移除对应事件名称的所有事件监听。

其它一些方法

监听器数量限制

1 个 EventEmitter 对象上,某个事件名称的最大监听器数量默认为 10,这可以通过 emitter.getMaxListeners() 来验证:

console.log(emitter.getMaxListeners()) // 10

比如写了 11 次 emitter.on('test', handler),就会报错,提示说要用 emitter.setMaxListeners() 来增加最大限制数量:

3.png

如果我们想知道当前 EventEmitter 对象上某个事件名称的监听器有多少个,有没有超过最大限制,可以使用 emitter.listenerCount() 传入事件名称查看:

console.log(emitter.listenerCount('test'))

获取事件名称和监听器

使用 emitter.eventNames() 可以获取当前 EventEmitter 对象上注册的所有事件名称,返回的是由事件字符串组成的数组

emitter.on('test1', handler)
emitter.on('test2', handler)

console.log(emitter.eventNames()) // [ 'test1', 'test2' ]

如果想获取某个事件对应的所有监听器,可以使用 emitter.listeners() 并传入事件名称:

function handler1() {}
function handler2() {}
emitter.on('test', handler1)
emitter.on('test', handler2)

console.log(emitter.listeners('test'))

得到的结果如下:

4.png

以上就是浅析Node的events模块的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 浅析Node的events模块

本文链接: https://www.lsjlt.com/news/207046.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅析Node的events模块
    在 vue 的项目中,有时我们会用到全局事件总线来管理组件之间的通信。vue2 项目里我们可以自己借助 $emit、 $on 和 $off 封装一个 eventHub;vue3 中 $on 和 $off 被移除了,我们可以使用 mitt 库...
    99+
    2023-05-14
    nodejs node
  • Node的events模块怎么使用
    这篇文章主要介绍了Node的events模块怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node的events模块怎么使用文章都会有所收获,下面我们一起来看看吧。在 vue 的项目中,有时我们会用到全...
    99+
    2023-07-05
  • 浅析node的path路径模块
    1.path路径模块初认识path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。2.path模块的API2.1 path.join()path.join() 方法,用来将...
    99+
    2023-05-14
    node path模块
  • Node中的Events模块介绍及应用
    目录Node 中的 Events1. 事件和监听器2. 处理 error 事件3. 继承 Events 模块4. 手写 EventEmitterNode 中的 Events Node...
    99+
    2022-11-13
    Node Events Node Events模块
  • 浅析node怎样链接多个JS模块
    有时候是不是会有这样的疑问:纷繁的功能文件,到最后是怎么组合成起来并且在浏览器中展示的?为什么需要 node 环境?下面本篇文章给大家介绍一下node是怎样把多个JS模块链接在一起的?希望对大家有所帮助!一、个人理解浏览器本身只能做一些展示...
    99+
    2023-05-14
    前端 Node.js JavaScript
  • 浅析node中如何优雅使用Socket.IO模块
    注意: 第二个参数可以传对象,因为在emit方法内部带有JSON.stringfy()方法,自动将对象转化为字符串。onsocket.on(eventName, callback):监听一个 emit 发射的事件socket.on('...
    99+
    2022-11-22
    Socket.IO nodejs​ node
  • 浅析Node中http模块怎么处理文件上传
    怎么使用Node.js的http模块处理文件上传?下面本篇文章就来看看在服务器端要如何处理前端上传的文件,希望对大家有所帮助!查看请求数据如果我们现在向服务器发送的数据如下图所示,里面包含了普通的字段信息 name 以及一个图片文件 fil...
    99+
    2023-05-14
    node HTTP模块
  • Node.js的Events模块怎么使用
    本篇内容主要讲解“Node.js的Events模块怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js的Events模块怎么使用”吧!Event...
    99+
    2024-04-02
  • nodejs中events模块怎么办
    这篇文章将为大家详细讲解有关nodejs中events模块怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如...
    99+
    2023-06-06
  • 什么是模块化?深析node模块化的那些事
    在上方的定义中未免有一些晦涩难懂,简单的给大家举个例子:我们小时候玩的小霸王游戏机,当我们玩烦了一款游戏的时候,我们不可能直接更换一个游戏机呀,我们可以通过更换游戏带从而体验各种不同的游戏。这种形式就是模块化,把游戏分化成一个个小模块,当我...
    99+
    2023-05-14
    node 模块化
  • Node模块化开发实例解析
    目录一、介绍1. 什么是模块化开发2. Node.js中的模块化3. 模块化开发的优点二、CommonJS规范1. CommonJS规范介绍2. Node.js中的模块加载机制3. ...
    99+
    2023-03-13
    Node模块化开发 Node 模块化
  • Node模块系统及其模式的示例分析
    小编给大家分享一下Node模块系统及其模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!模块是构建应用程序的基础,也使...
    99+
    2024-04-02
  • Node.js中的events事件模块怎么使用
    本篇内容主要讲解“Node.js中的events事件模块怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的events事件模块怎么使用”吧...
    99+
    2024-04-02
  • node中的fs模块、path模块怎么用
    本篇内容主要讲解“node中的fs模块、path模块怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“node中的fs模块、path模块怎么用”吧!fs文件系...
    99+
    2024-04-02
  • Node.js中的events事件模块知识点总结
    通过对Node的学习及应用,我们知道NodeJS其采用单线程、事件驱动、非阻塞I/O等架构设计,非常适用于高并发、I/O密集型应用。 1. 什么是事件驱动? 事件驱动,简单来说就是...
    99+
    2024-04-02
  • 聊聊Node中的url模块和querystring模块
    url模块和querystring模块是非常重要的两个URL处理模块。在做node服务端的开发时会经常用到。url在介绍url模块之前我们先来一张图,看懂了这张图对于url这个模块你就基本上没什么问题了。我们来解释下各自的含义protoco...
    99+
    2023-05-14
    Node.js 前端 面试
  • node中的path模块和fs模块怎么用
    本篇内容介绍了“node中的path模块和fs模块怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pa...
    99+
    2024-04-02
  • python simplejson模块浅
    一、背景知识JSON:引用百科描述如下,具体请自行搜索相关介绍:    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd ...
    99+
    2023-01-31
    模块 python simplejson
  • Node中的url模块和querystring模块怎么使用
    这篇文章主要讲解了“Node中的url模块和querystring模块怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node中的url模块和querystring模块怎么使用”吧!u...
    99+
    2023-07-05
  • 浅析Nodejs中的http模块和导出共享
    一、http 模块http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。【相关教程推荐:nodejs视频教程】通过 http 模块提供的 http.createServer() 方法,就能方便的把一台普通的电脑,变成...
    99+
    2022-11-22
    nodejs node
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作