EventEmitter

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);
})

你可能感兴趣的:(EventEmitter)