Node的事件模块中,目前只包含一个类:EventEmitter。这个类在Node的内置模块中被大量使用,在Node中,所有能触发事件的对象都是 EventEmitter 类的实例。要使用EventEmitter,首先必须要继承它。
一.从EventEmitter类继承
问题
你希望通过事件驱动的手段来解决问题。你有一个类你希望在异步事件发生的时候来操作它。
解决办法
你需要创建一个基于EventEmitter类的自定义类,基于EventEmitter类得到的示例,都绑定了一个监听器,eventEmitter.on()用于监听事件,eventEmitter.emit()用于触发事件。下面是一个音乐播放器的实例:
首先实现对EventEmitter类的继承
const EventEmitter = require('events');
//所有的构造函数都必须继承自EventEmitter类;
class MusicPlayer extends EventEmitter{};
//再通过这个构造函数来创建触发事件的对象
let musicPlayer = new MusicPlayer();
通过继承创建的实例对象有绑定监听器,可以调用on,emit方法
let AudioDevice = {
play:function(track){
//
},
stop:function(){
//
}
}
//监听事件
musicPlayer.on('play',function(track){
this.playing = true;
AudioDevice.play(track);
})
//监听事件
musicPlayer.on('stop',function(track){
this.playing = false;
AudioDevice.stop();
});
musicPlayer.emit('play','The Roots - The Fire');
setTimeout(function(){
//emit触发事件
musicPlayer.emit('stop')
},1000);
二.添加多个监听器
我们可以给事件添加多个监听器,比如上面的音乐播放器,我们在play触发时需要做些其他的事情比如用户界面需要更新等。对play事件添加一个新的监听器就能轻松实现。
musicPlayer.on('play',function(track){
this.playing = true;
AudioDevice.play(track);
});
//添加新的监听器
musicPlayer.on('play',function(track){
console.log('添加新的监听器')
});
三.移除监听器
eventEmitter.removeListener(eventname,fn):移除一个监听器
emitter.removeAllListeners([eventName]):移除所有的监听器
let playFn1 = function(track){
this.playing = true;
AudioDevice.play(track);
}
musicPlayer.on('play',playFn1);
//移除监听器
musicPlayer.removeEventListener('play',playFn1())
四.错误处理
通过监听error事件,来进行错误处理。
//错误处理
let playFn1 = function(track){
this.playing = true;
AudioDevice.play(track);
//这里如果出现错误,就触发error事件
this.emit('error','unable to play')
}
musicPlayer.on('play',playFn1);
musicPlayer.on('error',function(err){
console.log(err);
})