NodeJS学习——events模块
**ps:**这里介绍的只是events模块的一部分,不是全部内容
events模块值提供了一个对象events.EventEmitter,核心就是事件发射和事件监听
我们通过require('events')
使用events模块
emitter.on(event, listener)
添加一个 listener 至特定事件的 listener 数组尾部
**emitter.addListener(event, listener)**有相同的效果
// 调用events模块,获取events.EventEmitter对象
var EventEmitter = require('events').EventEmitter
var ee = new EventEmitter()
// EventEmitter.on(event, listener) 为事件注册一个监听器
// event: 字符串, 事件名
// listener: 回调函数
ee.on('some_event', function(first_name, last_name) {
console.log("第1个监听事件,我姓" + last_name + ", 叫" + first_name);
})
emitter.emit(event,[arg1],[arg2],[...])
使用提供的参数按顺序执行指定事件的 listener
上面的代码中我们只是注册了some_event事件,并没有触发,所以在执行的时候不会有任何输出
下面我们来触发注册号的监听事件,让程序输出一些东西
// 调用events模块,获取events.EventEmitter对象
var EventEmitter = require('events').EventEmitter
var ee = new EventEmitter()
// EventEmitter.on(event, listener) 为事件注册一个监听器
// event: 字符串, 事件名
// listener: 回调函数
ee.on('some_event', function(first_name, last_name) {
console.log("第1个监听事件,我姓" + last_name + ", 叫" + first_name);
})
console.log('第一轮');
ee.emit('some_event', 'xiaoming', 'wang')
emitter.once(event, listener)
添加一个 一次性 listener,这个 listener 只会在下一次事件发生时被触发一次,触发完成后就被删除。
emitter.removeListener(event, listener)
从一个事件的 listener 数组中删除一个 listener 注意:此操作会改变 listener 数组中在当前 listener 后的listener 的位置下标
ps:第二个参数listener:some_event注册事件的回调函数名称
// 调用events模块,获取events.EventEmitter对象
var EventEmitter = require('events').EventEmitter
var ee = new EventEmitter()
var listener = function(foo, bar) {
console.log('第1个监听事件,参数foo=' + foo + ", bar=" + bar);
}
ee.on('some_event', listener)
ee.on('other_event', listener)
ee.removeListener('some_event', listener)
console.log('第一轮')
ee.emit('some_event', 'xiaoming', 'wang')
ee.emit('other_event', 'haha', 'en')
emitter.removeAllListeners([event])
删除所有 listener,或者删除某些事件 (event) 的 listener
只需要传入注册的事件名就可以了,如果没有传入任何事件,则删除所有监听事件
var EventEmitter = require('events').EventEmitter
var ee = new EventEmitter()
var listener = function(foo, bar) {
console.log('第1个监听事件,参数foo=' + foo + ", bar=" + bar);
}
ee.on('some_event', listener)
ee.on('other_event', listener)
ee.removeAllListeners()
console.log('第一轮')
ee.emit('some_event', 'xiaoming', 'wang')
ee.emit('other_event', 'haha', 'en')
emitter.setMaxListeners(n)
默认情况下,EventEmitter 会在多于 10 个 listener 监听某个事件的时候出现警告,此限制在寻找内存泄露时非常有用。设置0这样可以没有限制。
var EventEmitter = require('events').EventEmitter
var ee = new EventEmitter()
//NodeJS采用异步编程方式,如果使用正常的for循环来写下面的代码会发现输出的信息不是我们想要的结果,可以踩下坑,哦,也不算是坑...
for (var i = 0; i < 11; i++) {
(function(j) {
ee.on('some_event', function() {
console.log('第' + (j + 1) + '个监听事件');
})
})(i)
}
ee.emit("some_event")
上面的代码中我们给some_event添加了11个监听,执行程序会有警告信息输出,在for循环前添加ee.setMaxListeners(11),再执行程序。
第一次写这个,有什么问题请大家指正一下