Node的事件模塊中啃憎,目前只包含一個類:EventEmitter。這個類在Node的內(nèi)置模塊中被大量使用蚤认,在Node中队魏,所有能觸發(fā)事件的對象都是 EventEmitter 類的實例振峻。要使用EventEmitter疗绣,首先必須要繼承它。
一.從EventEmitter類繼承
問題
你希望通過事件驅(qū)動的手段來解決問題铺韧。你有一個類你希望在異步事件發(fā)生的時候來操作它。
解決辦法
你需要創(chuàng)建一個基于EventEmitter類的自定義類缓淹,基于EventEmitter類得到的示例哈打,都綁定了一個監(jiān)聽器,eventEmitter.on()用于監(jiān)聽事件讯壶,eventEmitter.emit()用于觸發(fā)事件料仗。下面是一個音樂播放器的實例:
首先實現(xiàn)對EventEmitter類的繼承
const EventEmitter = require('events');
//所有的構(gòu)造函數(shù)都必須繼承自EventEmitter類;
class MusicPlayer extends EventEmitter{};
//再通過這個構(gòu)造函數(shù)來創(chuàng)建觸發(fā)事件的對象
let musicPlayer = new MusicPlayer();
通過繼承創(chuàng)建的實例對象有綁定監(jiān)聽器,可以調(diào)用on,emit方法
let AudioDevice = {
play:function(track){
//
},
stop:function(){
//
}
}
//監(jiān)聽事件
musicPlayer.on('play',function(track){
this.playing = true;
AudioDevice.play(track);
})
//監(jiān)聽事件
musicPlayer.on('stop',function(track){
this.playing = false;
AudioDevice.stop();
});
musicPlayer.emit('play','The Roots - The Fire');
setTimeout(function(){
//emit觸發(fā)事件
musicPlayer.emit('stop')
},1000);
二.添加多個監(jiān)聽器
我們可以給事件添加多個監(jiān)聽器伏蚊,比如上面的音樂播放器立轧,我們在play觸發(fā)時需要做些其他的事情比如用戶界面需要更新等。對play事件添加一個新的監(jiān)聽器就能輕松實現(xiàn)躏吊。
musicPlayer.on('play',function(track){
this.playing = true;
AudioDevice.play(track);
});
//添加新的監(jiān)聽器
musicPlayer.on('play',function(track){
console.log('添加新的監(jiān)聽器')
});
三.移除監(jiān)聽器
eventEmitter.removeListener(eventname,fn):移除一個監(jiān)聽器
emitter.removeAllListeners([eventName]):移除所有的監(jiān)聽器
let playFn1 = function(track){
this.playing = true;
AudioDevice.play(track);
}
musicPlayer.on('play',playFn1);
//移除監(jiān)聽器
musicPlayer.removeEventListener('play',playFn1())
四.錯誤處理
通過監(jiān)聽error事件氛改,來進行錯誤處理。
//錯誤處理
let playFn1 = function(track){
this.playing = true;
AudioDevice.play(track);
//這里如果出現(xiàn)錯誤比伏,就觸發(fā)error事件
this.emit('error','unable to play')
}
musicPlayer.on('play',playFn1);
musicPlayer.on('error',function(err){
console.log(err);
})