NodeJS_API_v5.1.0_Events
最近在看NodeJS,书上讲的东西毕竟不全,决定看一下官网的API。网上的确有翻译,但是自己翻译一遍,做个记录。(渣翻译没少悲剧)
Events模块
在NodeJS中很多Object都会发射事件。我们可以使用require('events')来使用此模块。为了处理发生的事件,我们可以将一个函数连接到Object。这个函数被成为listeners(监听器)。在listeners(监听器)中,this指向的是函数所关联的EventEmitter对象。
1 var EventEmitter = require('events').EventEmitter;
2 var event = new EventEmitter();
3
4 event.on('some_event',function(){
5 console.log(this === event); //结果为true
6 });
7
8 event.emit('some_event');
类:events.EventEmitter
当EventEmitter类实例遇到错误,通常的做法是发射一个'error'事件。error事件被视为NodeJS中的特殊情况。如果没有针对它的监听器,默认操作是打印错误的堆栈信息并退出程序。添加监听器,EventEmitter类实例会发射'newListener'事件;删除监听器,EventEmitter类实例会发射'removeListener'事件。
1 var EventEmitter = require('events').EventEmitter;
2 var event = new EventEmitter();
3
4 event.on('some_event',function(){
5 try{
6 throw new Error('some error'); //没有catch块只是throw错误是没有办法触发error事件的
7 } catch (err) {
8 event.emit('error', err);
9 }
10 });
11
12 event.emit('some_event'); //在此行抛出错误,没有对error事件监听
1 var EventEmitter = require('events').EventEmitter;
2 var event = new EventEmitter();
3
4 event.on('some_event',function(){
5 try{
6 throw new Error('some error');
7 } catch (err) {
8 event.emit('error', err);
9 }
10 });
11
12 event.on('error', function(err){
13 console.log('发生了一些错误:\n' + err); //打印显示错误信息
14 });
15
16 event.emit('some_event');
1. 继承类EventEmitter
1 'use strict'; //官网提供
2 const util = require('util');
3 const EventEmitter = require('events');
4
5 function MyEventEmitter() {
6 // Initialize necessary properties from `EventEmitter` in this instance
7 EventEmitter.call(this);
8 }
9
10 // Inherit functions from `EventEmitter`'s prototype
11 util.inherits(MyEventEmitter, EventEmitter);
2. 类方法EventEmitter.listenerCount(emitter,event)
官方不推荐,使用emitter.listenerCount函数代替
3. 事件'newListener'和事件'removeListener'
参数:event:添加或删除的事件的名称(字符串);listener:添加或删除的监听器函数(函数)。
监听器添加前发射事件newListener,监听器删除后发射事件removeListener。Any listeners added to the event name
in the newListener event callback will be added before the listener that is in the process of being added.(个人理解:当添加listener A时会触发newListener事件,如果在事件的回调函数中添加了其他的监听器listener B,那么listenerB会先于listenerA被添加)
1 var EventEmitter = require('events').EventEmitter; 2 var event = new EventEmitter(); 3 4 event.on('newListener',function(aEvent, listener){ 5 console.log('对事件' + aEvent + '添加监听器'); //1.添加事件some_event触发这个函数 6 if (aEvent === 'some_event') { 7 event.on('other_event',function(){ 8 console.log('other event happened'); //2.添加事件other_event依旧会触发事件newListener,并打印日志 9 }); 10 console.log(event.listenerCount('other_event')); //3.此时事件other_event已经存在了一个监听器 11 console.log(event.listenerCount('some_event')); //4.但事件some_event里还没有监听器 12 } 13 }); 14 15 event.on('some_event',function(){ 16 console.log('some event happened'); 17 }); 18 19 event.emit('some_event');
4. 类属性EventEmitter.defaultMaxListeners 默认最大监听器数(我认为是监听器的数量)
可以通过函数emitter.serMaxListeners(n)来设置每一个emiter实例的最大监听器数。这个类属性会影响所有的类实例。立即生效。但函数emitter.serMaxListeners(n)的优先级大于这个类属性。
5. emitter.addListener(event,listener)
等同于emitter.on(event,listener)
6. emitter.emit(event[, arg1][, arg2][, ...])
调用每一个监听者。如果存在监听者返回true,否则返回false。
7. emitter.getMaxListeners()
返回此实例的最大监听器的数量。
8. emitter.listenerCount(type)
返回事件的监听器的数量
9. emitter.listeners(event)
返回事件的监听器数组(函数的数组)
10. emitter.on(event,listener)
向事件添加一个监听器。不会检查监听器是否已经存在。多次调用相同的事件与监听器的组合会使监听器被多次添加。
返回emitter,可以链式调用。
11. emitter.once(event,listener)
添加一次性监听器。触发之后就会被移除。其他特性同上。
12. emitter.removeAllListeners([event])
移除所有的监听器或指定事件的所有监听器。不建议移除在别的代码里添加的监听器,尤其是那些不是你创建的emitter。
返回emitter,可以链式调用。
13. emitter.removeListener(event,listener)
从指定事件的监听器队列中移除一个监听器。注意,会改变此监听器后面所有监听器的索引。
这个函数最多移除监听器队列中的一个实例。如果针对一个监听器添加了多次,那么也必须多次调用这个函数才能完全移除。
返回emitter,可以链式调用。
14. emitter.setMaxListeners(n)
默认情况下,当对一特定事件添加超过10个监听器的时候,会打印warning信息(经测试,这个限制是针对emitter的而不是针对event的。也就是说,对于emitter添加超过10个监听器的时候会发出警告)。这是一个很有用的默认,它会帮助发现内存泄漏。明显不是所有的emitters都要限制10,这个函数可以对其增加。设置为infinity或0时为不限制。
返回emitter,可以链式调用。
1 var EventEmitter = require('events').EventEmitter; 2 var event = new EventEmitter(); 3 EventEmitter.defaultMaxListeners = 1; 4 5 event.on('some_event1',function(){ 6 console.log('some event1 happened'); 7 }); 8 9 event.on('some_event',function(){ //在此行报错console.error is not a function (奇怪的报错),里面写的倒是warning 10 console.log('some event happened'); 11 }); 12 13 event.emit('some_event');
东西写出来才发现不知道的东西好多,计划写两个小时的写了一天。好拖啊我。。
算是写完了。希望能帮到大家。
下篇写http模块的吧。