梦入琼楼寒有月,行过石树冻无烟

Node events 事件触发器

Node 是一个主要通过 API 使用异步事件模型的 I/O 操作,某些类型对象或触发器周期的触发一个命名事件到 事件队列,如 net.Server 对象在每次连接时出发一个事件,以及 fs.readStream 对象在文件打开时也触发一个事件。

在这些过程中,所有能产生事件的对象都是 events.EventEmitter 实例,其中 events 模块中就只提供了一个 events.EventEmitter 对象,因此 EventEmitter 的核心就是事件的触发和事件的监听功能的封装。

注册事件 & 监听器

通过 event.emit 对象创建一个 some_event 对象,并在 3000ms 后触发该事件,然后通过 event.on 来触发该事件,此时 event.on 将是一个监听事件触发的作用。

1
2
3
4
5
6
7
8
9
10
11
12
const EventEmitter = require('events').EventEmitter
const event = new EventEmitter()

// 调用 some_event 对象时触发回调
event.on('some_event', function () {
console.log('some_event 事件触发')
})

// 3000ms 后向 "event" 对象发送事件 "some_event"
setTimeout(function () {
event.emit('some_event')
},3000)

除此之外,EventEmitter 的每个事件由一个事件名和诺干的参数组成,事件名则是一个字符串形式,这通常表示一定的语义,对于每个事件、EventEmitter 还提供了一个支持多个事件的监听器,当该事件触发时,事件的监听器依次都会被调用,事件的参数会作为回调参数传递。

对于多个事件,当事件被触发时将会依次被输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const events = require('events')
const emitter = new events.EventEmitter()

/*
some_event1 参数1 参数2
some_event2 参数1 参数2
*/
emitter.on('some_event', function (args1,args2) {
console.log('some_event1', args1, args2)
})

emitter.on('some_event', function (args1,args2) {
console.log('some_event2', args1, args2)
})
emitter.emit('some_event', '参数1','参数2')

this

emit 方法允许为监听器传入任意参数,之后事件监听器中的 this 方法将会用于输出当前的事件属性和传入的方法等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const events = require('events')
const eventEmitter = new events.EventEmitter

/*
some_event
a b EventEmitter {
_events: [Object: null prototype] { some_event: [Function (anonymous)] },
_eventsCount: 1,
_maxListeners: undefined,
[Symbol(kCapture)]: false
}
*/
eventEmitter.on('some_event', function (a,b) {
console.log('some_event')
console.log(a,b, this)
})

eventEmitter.emit('some_event','a','b')

on at once

event 中,监听事件的方法可以通过 ononce 进行实现,两者的主要区别是后者只可以监听单次的 listener 函数,当下次在触发事件时,将会移出此监听器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const event = require('events')
const eventEmitter = new event.EventEmitter

/*
eventEmitter some_event
eventEmitter some_event
eventEmitter someEvent
*/
eventEmitter.on('some_event', function () {
console.log('eventEmitter some_event');
})

eventEmitter.emit('some_event')
eventEmitter.emit('some_event')

eventEmitter.once('someEvent', function () {
console.log('eventEmitter someEvent');
})

eventEmitter.emit('someEvent')
eventEmitter.emit('someEvent')

添加/移出监听器事件

通过 once 创建一个事件,且侦听 start 事件,并通过 eventEmitter.emit 方法来进行调用此方法,因此输出的是 netListenerstart 事件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const events = require('events')
const eventEmitter = new events.EventEmitter

eventEmitter.once('newListener', function (event, listener) {
if (event == 'start') {
eventEmitter.on('start', function () {
console.log('start 2')
})
console.log('start')
}
})

eventEmitter.on('start', function () {
console.log('eventEmitter start')
})

// 调用事件
eventEmitter.emit('start')
⬅️ Go back