美文网首页
EventEmitter

EventEmitter

作者: 海因斯坦 | 来源:发表于2018-11-14 18:45 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/zaajfqtx.html