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');
    
  • 相关阅读:
    filp_open/filp_close/vfs_read/vfs_write
    memcpy一种实现方法
    memset函数的实现&printf函数几种输出格式的输出结果
    break退出循环分析
    定义指针变量作为返回值函数执行时报 段错误(核心已转储)
    node实现防盗链
    js实现输入密码之延迟星号和点击按钮显示或隐藏
    rem适配
    使用字蛛教程以及遇到的bug
    es6学习笔记-proxy对象
  • 原文地址:https://www.cnblogs.com/xianwang/p/5034656.html
Copyright © 2011-2022 走看看