加入收藏 | 设为首页 | 会员中心 | 我要投稿 草根网 (https://www.0555zz.com/)- 数据标注、建站、AI硬件、智能营销、数据计算!
当前位置: 首页 > 教程 > 正文

Node的events模块怎么应用

发布时间:2023-07-31 12:00:49 所属栏目:教程 来源:转载
导读:   这篇文章主要介绍了Node的events模块怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node的events模块怎么使用文章都会有所收获,下面我们一起
  这篇文章主要介绍了Node的events模块怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node的events模块怎么使用文章都会有所收获,下面我们一起来看看吧。

  在 vue 的项目中,有时我们会用到全局事件总线来管理组件之间的通信。vue2 项目里我们可以自己借助 $emit、 $on 和 $off 封装一个 eventHub;vue3 中 $on 和 $off 被移除了,我们可以使用 mitt 库或 tiny-emitter 库。在 node 里,则不用这么麻烦,其有个内置的 events 模块就可以帮我们实现对于事件的监听和发射。
 
  事件的监听和发射
 
  先使用 CommonJS 的语法导入得到 EventEmitter 类,然后生成实例 emitter(EventEmitter 十分重要,比如后续文章会介绍的 stream 就是 EventEmitter 的实例):
 
  const EventEmitter = require('events')
 
  const emitter = new EventEmitter()
 
  接着就可以使用 emitter.on() 对事件进行监听,传入的第 1 个参数就是事件名称,第 2 个参数为监听到事件被发射后要执行的回调,如果发射事件时有传入参数,会传递给回调函数,可以一个个单独获取,也可以像下面这样使用函数的剩余参数获取:
 
  // 监听事件
 
  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')
 
  执行结果:
 
  Node的events模块怎么使用
 
  如果想把监听事件添加到最前面,可以使用 emitter.prependListener()(或者 emitter.prependOnceListener(),即提前但只监听一次):
 
  emitter.on('test', () => {
 
    console.log('监听到了事件发射,1')
 
  })
 
  emitter.prependListener('test', () => {
 
    console.log('监听到了事件发射,2')
 
  })
 
  emitter.emit('test')
 
  移除事件监听
 
  可以使用 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() 来增加最大限制数量:
 
  如果我们想知道当前 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'))
 

(编辑:草根网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章