Appearance
Event 事件
Node使用 发布订阅模式 实现 Event 事件,node 中的事件对象都是 events.EventEmitter 对象的实例。在 Node中多数模块都继承了事件,如 fs、http 、stream 。
常用方法
- on 方法用于订阅监听事件
- emit 方法用于触发事件
- once 订阅一次事件,即执行后删除事件
- removeListener 移除事件
- removeAllListeners 移除所有事件
基本使用
下面是事件定义的实例
- 我们可以注册多个事件监听
import EventEmitter from 'events'
const event = new EventEmitter()
//监听事件
event.on('bm', (content) => {
console.log(`第1次触发事件:${content}`)
})
//监听事件
event.on('bm', (content) => {
console.log(`第2次触发事件:${content}`)
})
console.log('事件驱动是异步的,所以这行代码先执行')
// 触发事件
event.emit('bm', 'banmashou.com')
once 指注册一次事件监听,触发后就移除事件监听
import EventEmitter from 'events'
const event = new EventEmitter()
//监听事件
event.once('bm', (content) => {
console.log(`第1次触发事件:${content}`)
})
let res = event.emit('bm', 'banmashou.com')
console.log(res) //true
//没有结果
res = event.emit('bm', '斑马兽')
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('bm', () => {
console.log('1')
})
event.on('bm', () => {
console.log(2)
})
console.log(event.listeners('bm'))
event.listeners('bm').forEach((fun) => fun())
//1,2
listenerCount 获取指定事件的监听数量
import EventEmitter from 'events'
const event = new EventEmitter()
event.on('bm', () => {})
event.on('bm', () => {})
console.log(event.listenerCount('bm'))
//2
移除事件
使用 removeListener 移除已经注册的事件监听,参数一为事件名,参数二为监听函数。
- off 是 removeListener 别名
import EventEmitter from 'events'
const event = new EventEmitter()
//监听事件
const listener = (content: string) => {
console.log(`第1次触发事件:${content}`)
}
event.on('bm', listener)
event.removeListener('bm', listener)
const res = event.emit('bm', '斑马兽')
console.log(res)
//false
使用 removeAllListeners 移除所有监听,不需要指定监听函数
import EventEmitter from 'events'
const event = new EventEmitter()
//监听事件
const listener = (content: string) => {
console.log(`第1次触发事件:${content}`)
}
event.on('bm', listener)
//移除所有监听
event.removeAllListeners('bm')
const res = event.emit('bm', '斑马兽')
console.log(res)
//false