腊月的季节

javascript事件监听器

事件监听器

Nodejs所有的异步I/O操作在完成时都会发送一个事件到事件队列。
events模块只提供了一个对象:events.EventEmitter。EventEmitter的核心就是事件触发与事件监听器功能的封装。该模块已被node.js默认模块,不需要require()显示引入。
EventEmitter对象如果在实例化时发生错误,会触发’error’事件。当添加新的监听器时,’newListener’时,’removeListener’事件被触发。

  • on(event,listener)

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

1
2
3
4
5
6
7
8
var myEvent = new events.EventEmitter();
var listener = function(){
console.log('someEvent emit');
}
myEvent.on('someEvent',listener);
setTimeout(function(){
myEvent.emit('someEvent');
},1000);

EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter支持若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

1
2
3
4
5
6
7
8
9
10
11
var myEvent = new events.EventEmitter();
myEvent.on('someEvent',function(arg1,arg2) {
console.log('someEvent 1 emit',arg1,arg2);
});
myEvent.on('someEvent',(arg1,arg2)=>console.log('someEvent 2 emit',arg1,arg2));
myEvent.emit('someEvent','arg1','arg2');
/*
输出
someEvent 1 emit arg1 arg2
someEvent 2 emit arg1 arg2
*/

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var myEvent = new events.EventEmitter();
    myEvent.once('someEvent',function(){
    console.log('someEvent emit');
    });
    myEvent.emit('someEvent');
    /*
    返回true
    输出 someEvent emit
    */
    myEvent.emit('someEvent');
    //返回true
  • removeListener(event,listener)
    移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。

    1
    2
    3
    4
    5
    6
    var myEvent = new events.EventEmitter();
    var listener = () => console.log('someEvent emit');
    myEvent.on('someEvent',listener);
    myEvent.removeListener('someEvent',listener);
    myEvent.emit('someEvent');
    //返回false

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function sel(){
this.events = {};
}
sel.prototype.on = function(eventName,callback){
this.events[eventName] = this.events[eventName] || [];
this.events[eventName].push(callback);
};
sel.prototype.emit = function(eventName){
var args = Array.prototype.slice.call(arguments,1);
var events = this.events[eventName];
var i,m;
for(i=0,m=events.length;i<m;i++){
events[i].apply(null,args);
}

}
var b = new sel();
b.on('send_message',function(msg){
alert(msg);
});
b.emit('send_message',{wo:1,ni:2});

程序中var that = this的意义

可以看到,this对象在程序中随时会改变,而var that=this之后,that没改变之前仍然是指向当时的this,这样就不会出现找不到原来的对象。

热评文章