NodeJS_API_v5.1.0_Events

最近在看NodeJS,书上讲的东西毕竟不全,决定看一下官网的API。网上的确有翻译,但是自己翻译一遍,做个记录。(渣翻译没少悲剧)

Events.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模块的吧。

posted @ 2015-11-26 11:01  MarshR  阅读(168)  评论(4编辑  收藏  举报