nodejs events

EventEmitter类

events模块提供一个对象:events.EventEmitter,核心是事件触发和事件监听的封装。

大多数时候不会直接使用EventEmitter,而是在对象中继承它(new一个出来)。

方法:

on:

为指定事件注册一个监听器,接收一个字符串event和一个回调函数。

emit:

触发事件。返回值为布尔值。

once:

为指定事件注册一个单次监听器,最多只会触发一次,触发后立刻解除该监听器。

addListener:

为指定事件添加一个监听器到监听器数组的尾部。

removeListener:

移出指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。接收两个参数,一个是事件名称,第二个是回调函数名称。

removeAllListeners:

移除所有事件的监听器,如果指定事件,则移除指定事件的所有监听器。

listeners:

返回指定事件的监听器数组。

示例:

//test.js文件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();

var listener1 = function listener1() {
    console.log('监听器1执行');
};

var listener2 = function listener2() {
    console.log('监听器2执行');
};

emitter.on('someEvent', listener1);

emitter.on('someEvent', listener2);

var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent');

console.log(eventListeners + '个监听器');   //2个监听器

emitter.emit('someEvent');

//移除第一个监听器listenter1
emitter.removeListener('someEvent', listener1);

var eventListeners = EventEmitter.listenerCount(emitter, 'someEvent');

console.log(eventListeners + '个监听器');   //1个监听器

console.log('程序执行完毕');

执行:

$ node test.js
2个监听器
监听器1执行
监听器2执行
1个监听器
程序执行完毕

setMaxListeners:

默认情况下,EventEmitters超过10个监听器就会输出警告信息。setMaxListeners函数用于提高监听器的默认限制的数量。

示例:

//test.js文件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();

emitter.on('someEvent', function () {
    console.log('监听器1执行');
});
emitter.on('someEvent', function () {
    console.log('监听器2执行');
});
emitter.on('someEvent', function () {
    console.log('监听器3执行');
});
emitter.on('someEvent', function () {
    console.log('监听器4执行');
});
emitter.on('someEvent', function () {
    console.log('监听器5执行');
});
emitter.on('someEvent', function () {
    console.log('监听器6执行');
});
emitter.on('someEvent', function () {
    console.log('监听器7执行');
});
emitter.on('someEvent', function () {
    console.log('监听器8执行');
});
emitter.on('someEvent', function () {
    console.log('监听器9执行');
});
emitter.on('someEvent', function () {
    console.log('监听器10执行');
});
emitter.on('someEvent', function () {
    console.log('监听器11执行');
});


emitter.emit('someEvent');

命令行执行:

$ node test.js
监听器1执行
监听器2执行
监听器3执行
监听器4执行
监听器5执行
监听器6执行
监听器7执行
监听器8执行
监听器9执行
监听器10执行
监听器11执行
(node:10112) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 someEvent listeners added. Use emitter.setMaxListeners() to increase limit

当绑定的监听器超过10个时,虽然程序顺利执行,但是抛出了警告。如下所示,就不会发出警告了。要添加在监听器绑定的前面。

//test.js文件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();

emitter.setMaxListeners(11);    //提高监听器的默认限制数量

emitter.on('someEvent', function () {
    console.log('监听器1执行');
});
emitter.on('someEvent', function () {
    console.log('监听器2执行');
});
emitter.on('someEvent', function () {
    console.log('监听器3执行');
});
emitter.on('someEvent', function () {
    console.log('监听器4执行');
});
emitter.on('someEvent', function () {
    console.log('监听器5执行');
});
emitter.on('someEvent', function () {
    console.log('监听器6执行');
});
emitter.on('someEvent', function () {
    console.log('监听器7执行');
});
emitter.on('someEvent', function () {
    console.log('监听器8执行');
});
emitter.on('someEvent', function () {
    console.log('监听器9执行');
});
emitter.on('someEvent', function () {
    console.log('监听器10执行');
});
emitter.on('someEvent', function () {
    console.log('监听器11执行');
});

emitter.emit('someEvent');

监听事件的最大额度并不是为所有事件分配的,例如下面代码,不会发出监听器数量警告

var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();

emitter.on('someEvent', function () {
    console.log('监听器1执行');
});
emitter.on('someEvent', function () {
    console.log('监听器2执行');
});
emitter.on('someEvent', function () {
    console.log('监听器3执行');
});
emitter.on('someEvent', function () {
    console.log('监听器4执行');
});
emitter.on('someEvent', function () {
    console.log('监听器5执行');
});
emitter.on('someEvent', function () {
    console.log('监听器6执行');
});
emitter.on('someEvent2', function () {
    console.log('监听器7执行');
});
emitter.on('someEvent2', function () {
    console.log('监听器8执行');
});
emitter.on('someEvent2', function () {
    console.log('监听器9执行');
});
emitter.on('someEvent2', function () {
    console.log('监听器10执行');
});
emitter.on('someEvent2', function () {
    console.log('监听器11执行');
});

emitter.emit('someEvent');
emitter.emit('someEvent2');

转载于:https://www.cnblogs.com/lianglanlan/p/8716409.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值