zoukankan      html  css  js  c++  java
  • nodejs中EventEmitter

    在模块events中,定义了一个EventEmitter类,可以使用var EventEmitter = require('events');访问它。基本上所有发送事件的对象都是继承自EventEmitter。有基本属性和方法如下。

    • setMaxListeners(n)
      设置事件的最大监视者数量
    • getMaxListeners(n)
      获取事件的最大监视者数量
    • on(event, listener)/addListener(event, listener)
      为事件增添一个监视者
    • once(event, listener)
      为事件增添一个一次监视者
    • removeListener(event, listener)
      为事件删除一个监视者,注意listener指向同一个事件监听函数。
    • removeAllListeners([event])
      如果无参数,移除所有事件的监视者。如果参数为event,移除该事件的监视者。
    • listenerCount(event)
      获取特定事件的监视者数量。
    • listeners(event)
      获取特定事件的监听者列表。
    • _eventsCount
      事件的数量
    var EventEmitter = require('events');
    
    var em = new EventEmitter();
    em.setMaxListeners(2);
    
    var start = (data) => console.log(`data ${data} start`);
    var end = (data) => console.log(`data ${data} end`);
    
    em.on('data', start);
    em.on('data', end);
    
    em.once('close', () => console.log('close...'));
    
    console.log(`the max listeners value: ${em.getMaxListeners()}`);
    console.log(`the number of event: ${em._eventsCount}`);
    console.log(`the number of listeners the data event: ${em.listenerCount('data')}`);
    console.log(`the number of listeners the data close: ${em.listenerCount('close')}`);
    
    
    setInterval(() => {
        em.emit('data', 'eat');
        em.emit('data', 'play')
        em.emit('close');
    }, 1000);
    
    setTimeout(() => {
        em.removeListener('data', start);
        em.removeListener('data', end);
    }, 3000);
    

    写一个继承EventEmitter的对象。使用 util.inherits() 来完成对象的继承。

    var EventEmitter = require('events');
    var util = require('util');
    
    function MyStream() {
        EventEmitter.call(this);
    }
    
    util.inherits(MyStream, EventEmitter);
    
    MyStream.prototype.write = function (data){
        this.emit('write', data);
    }
    
    var stream = new MyStream();
    
    stream.on('write', function(data) {
        console.log(data);
    });
    
    stream.write('hello, world');
    

    再用ES6的class重写一下继承。

    var EventEmitter = require('events');
    
    class MyStream extends EventEmitter {
        write(data) {
            this.emit('write', data);
        }
    }
    
    var stream = new MyStream();
    stream.on('write', data => console.log(data));
    stream.write('hello, world');
    stream.write('hello, world');
    stream.write('hello, world');
    
  • 相关阅读:
    九、linux-msyql下的mysql主从复制深度实战
    八、linux-mysql的mysql主从复制原理和实战
    七、linux-mysql下mysql增量备份与恢复
    六、linux-mysql的mysql字符集问题
    入坑django2
    python根据已有数据库生成model.py
    docker 常用命令记录
    gitlab自带的Nginx与原Nginx冲突的解决方案
    linux下PHP安装redis扩展
    jenkins自动部署代码到多台服务器
  • 原文地址:https://www.cnblogs.com/xianwang/p/5034656.html
Copyright © 2011-2022 走看看