目录
模拟事件
Node.js
的⼤部分核⼼
API
都是围绕惯⽤的异步事件驱动架构构建的,在该架构中,某些类型的对象(
称为
"
触发器
")
触发命名事件,使
Function
对象
("
监听器
")
被调⽤。
nodejs中的事件驱动是利用触发器中的API来进行完成的,EventEmitter就是一个触发器。
let EventEmitter = require('events')
console.log(EventEmitter);
EventEmitter打印结果:
可以看出EventEmitter是一个类,或者说是一个构造函数。它内部的EventEmitter和EventEmitter是一样的,即:
console.log(EventEmitter.EventEmitter === EventEmitter); //true
我们可以将EventEmitter解构出来,并重命名为temp:
let {EventEmitter:temp} = require('events')
console.log(temp);
我们可以创建一个EventEmitter实例,然后通过实例调用EventEmitter中的方法:
let EventEmitter = require('events')
// 创建一个EventEmitter实例
let emitter = new EventEmitter()
// 调用EventEmitter中的on方法
emitter.on('event',()=>{
console.log('event');
})
// 触发事件
emitter.emit('event')
API
事件注册:
emitter.on(eventName, listener)
emitter.addListener(eventName, listener)emitter.once(eventName, listener)事件发射器:(触发事件使用事件发射器)emitter.emit(eventName[,param,param])返回列出触发器已为其注册监听器的事件的数组:emitter.eventNames()返回名为 eventName 的事件的监听器数组的副本:emitter.listeners(eventName)事件解绑:emitter.off(eventName, listener)emitter.removeListener(eventName, listener)emitter.removeAllListeners([eventName])
事件注册
事件注册可以使用on、addListener、once方法,它们都有两个参数,第一个参数表示事件名,第二个参数表示事件处理程序,我们可以给事件处理程序传递参数。
使用on方法可以注册一个事件多次。
使用once方法注册事件,事件被调用一次就会被销毁。
let EventEmitter = require('events');
// 声明发射器
let emitter = new EventEmitter();
// 注册事件 on
emitter.on('event',(params)=>{
console.log('event',params)
});
emitter.on('event',(params)=>{
console.log('另一个event',params)
});
// 注册事件 方式 addListener 参数:事件名称 事件处理程序
emitter.addListener('event1',(params)=>{
console.log('event1',params);
});
emitter.addListener('event2',(params)=>{
console.log('event2',params);
});
// 注册事件 once 一次绑定 触发完解绑
emitter.once('event3',(params)=>{
console.log('event3',params);
});
console.log(emitter.eventNames(),'触发事件之前');
// 触发事件
emitter.emit('event',100);
emitter.emit('event1',100);
emitter.emit('event2',100);
emitter.emit('event3',100);
// 返回已经注册事件的数组
console.log(emitter.eventNames(),'触发事件之后');
// 返回事件的事件监听器
console.log(emitter.listeners('event'));
结果如下:
事件解绑
事件解绑可以使用off、removeListener、removeAllListeners方法。
使用removeAllListeners可以一次性解绑所有事件。
let EventEmitter = require('events');
let emitter = new EventEmitter();
// 注册事件
function handler(params){
console.log(params+'event')
}
function handler1(params){
console.log(params+'另一个event')
}
emitter.on('event',handler);
emitter.on('event',handler1);
// 返回事件的事件监听器组成数组的副本
console.log(emitter.listeners('event'));
// 解绑事件
// emitter.off('event',handler);
// emitter.removeListener('event',handler1);
// 一次性解绑全部事件监听器 事件名称
emitter.removeAllListeners('event');
console.log(emitter.listeners('event'));//[]