Skip to content

Event 事件

向军大叔每晚八点在 抖音bilibli 直播

xj-small

Node使用 发布订阅模式 实现 Event 事件,node 中的事件对象都是 events.EventEmitter 对象的实例。在 Node中多数模块都继承了事件,如 fs、http 、stream 。

常用方法

  • on 方法用于订阅监听事件
  • emit 方法用于触发事件
  • once 订阅一次事件,即执行后删除事件
  • removeListener 移除事件
  • removeAllListeners 移除所有事件

基本使用

下面是事件定义的实例

  • 我们可以注册多个事件监听
import EventEmitter from 'events'

const event = new EventEmitter()

//监听事件
event.on('hd', (content) => {
  console.log(`第1次触发事件:${content}`)
})

//监听事件
event.on('hd', (content) => {
  console.log(`第2次触发事件:${content}`)
})

console.log('事件驱动是异步的,所以这行代码先执行')

// 触发事件
event.emit('hd', 'houdunren.com')

once 指注册一次事件监听,触发后就移除事件监听

import EventEmitter from 'events'

const event = new EventEmitter()

//监听事件
event.once('hd', (content) => {
  console.log(`第1次触发事件:${content}`)
})

let res = event.emit('hd', 'houdunren.com')
console.log(res) //true
//没有结果
res = event.emit('hd', '后盾人')
console.log(res) //false

自定义事件

下面是 EventEmitter 对象被继承来使用

import EventEmitter from 'events'

class Uploader extends EventEmitter {
  constructor() {
    super()
  }

  make(file: string) {
    this.emit('success', `${file}-文件上传成功`)
  }
}

const uploadHandler = new Uploader()

uploadHandler.on('success', (message) => {
  console.log(message)
})

uploadHandler.make('a.jpg')

事件信息

listeners 可获取指定事件的监听函数

import EventEmitter from 'events'

const event = new EventEmitter()

event.on('hd', () => {
  console.log('1')
})
event.on('hd', () => {
  console.log(2)
})

console.log(event.listeners('hd'))

event.listeners('hd').forEach((fun) => fun()) 
//1,2

listenerCount 获取指定事件的监听数量

import EventEmitter from 'events'

const event = new EventEmitter()

event.on('hd', () => {})
event.on('hd', () => {})

console.log(event.listenerCount('hd'))
//2

移除事件

使用 removeListener 移除已经注册的事件监听,参数一为事件名,参数二为监听函数。

  • off 是 removeListener 别名
import EventEmitter from 'events'

const event = new EventEmitter()

//监听事件
const listener = (content: string) => {
  console.log(`第1次触发事件:${content}`)
}
event.on('hd', listener)

event.removeListener('hd', listener)

const res = event.emit('hd', '后盾人')
console.log(res)
//false

使用 removeAllListeners 移除所有监听,不需要指定监听函数

import EventEmitter from 'events'

const event = new EventEmitter()

//监听事件
const listener = (content: string) => {
  console.log(`第1次触发事件:${content}`)
}
event.on('hd', listener)

//移除所有监听
event.removeAllListeners('hd')

const res = event.emit('hd', '后盾人')
console.log(res)
//false