5. envents node事件机制
所有能触发事件的对象都是enventEmitter类的实例。这些对象开发了一个enventEmitter.on()函数,允许将一个或者多个函数绑定到会被对象触发的命名事件上,事件名称通常是驼峰式的字符串,但也可以使用任何有效的javascript属性名。
(1)EventEmitter类
- EventEmitter.defaultMaxListeners ---每个事件可注册的监听器最大数量
// 导入模块 const eventEmitter = require('events'); console.log('每个事件可注册的监听器最大数量'+eventEmitter.defaultMaxListeners); /* * dom绑定的监听事件:可添加多个监听器 * dom.addEventListenner('click',fn) * dom.addEventListenner('click',fn) * dom.addEventListenner('click',fn) * */
(2)事件(emitter对象)
- newListener ---内置事件,自动触发监听器
// 导入模块 const eventEmitter = require('events'); // 实例化,emitter:监听事件和出发事件 const emitter = new eventEmitter(); // 内置事件,自动触发 emitter.on('newListener',function (event,listner) { console.log(event+'添加了新的监听器'); }); // 监听事件 或 添加aa监听器 emitter.on('a',function () { console.log('a触发1'); }); emitter.on('a',function () { console.log('a触发2'); }); emitter.on('a',function () { console.log('a触发3'); }); //手动触发事件 emitter.emit('aa');
- removeListener
// 导入模块
const eventEmitter = require('events');
// 实例化,emitter:监听事件和出发事件
const emitter = new eventEmitter();
// 移除事件监听器
emitter.on('removeListener',function (event) {
console.log(event+'监听器被移除');
});
// 监听事件 或 添加aa监听器
emitter.on('a',function () {
console.log('a触发1');
});
emitter.on('a',function () {
console.log('a触发2');
});
emitter.on('a',function () {
console.log('a触发3');
});
// 移除移除事件
emitter.removeListeners('a');//移除所有的事件的监听器,输出:
// a监听器被移除
// a监听器被移除
// a监听器被移除
emitter.removeAllListeners();//输出:newListener监听器被移除
// a监听器被移除
// a监听器被移除
// a监听器被移除
(3)属性(emitter对象)
- Emitter.on() --添加事件监听器
- Emitter.addListener() ---on()方法的别名
- Emitter.once() ---事件只能触发一次
// 导入模块
const eventEmitter = require('events');
// 实例化,emitter:监听事件和出发事件
const emitter = new eventEmitter();
emitter.once('b',function () {
console.log('b触发1');
});
emitter.emit('b');
emitter.emit('b');//输出都是一个'b触发1'
- Emitter.prependListener() ---优先加载
- Emitter.prependOnceListener() ---优先加载
例子:
// 导入模块
const eventEmitter = require('events');
// 实例化,emitter:监听事件和出发事件
const emitter = new eventEmitter();
// 监听事件 或 添加aa监听器
emitter.on('a',function () {
console.log('a触发1');
});
emitter.on('a',function () {
console.log('a触发2');
});
emitter.on('a',function () {
console.log('a触发3');
});
emitter.prependListener('a',function () {
console.log('prependListener:a被触发了');
});
//手动触发事件
emitter.emit('a');/* prependListener:a被触发了;a触发1;a触发2;a触发3*/
- Emitter.emit() ---触发事件
- Emitter.removeAllListeners(eventName) --移除事件
- Emitter.removeListener(eventName,listener) --移除指定事件的指定监听器
- Emitter.enventNames() --事件监听列表
// 导入模块
const eventEmitter = require('events');
// 实例化,emitter:监听事件和出发事件
const emitter = new eventEmitter();
// 监听事件 或 添加aa监听器
emitter.on('a',function () {
console.log('a触发1');
});
emitter.once('b',function () {
console.log('b触发1');
});
//手动触发事件
emitter.emit('a');
console.log(emitter.eventNames('a'));//输出[ 'a', 'b' ]
- Emitter.getMaxListeners() ---获取监听器
- Emitter.setMaxListeners() ---设置监听器数
emitter.setMaxListeners(15);
console.log(emitter.getMaxListeners());//15
- Emitter.listenerCount(eventName) ---
- Emitter.listeners(enventName) ---获取监听器数量
console.log(emitter.listenerCount('a'));