`

03.node.js事件类EventEmitter

阅读更多
  1. EventEmitter类
    EventEmitter的核心就是事件触发和事件监听功能的封装.
    支持事件响应的核心模块都是EventEmitter的子类,一般使用子类就可以了.
    EventEmitter的简单例子EventEmitterDemo.js如
    var events = require('events');//引入模块
    //events模块只提供了一个对象events.EventEmitter
    var eventEmitter = new events.EventEmitter();//创建eventEmitter对象
    
    eventEmitter.on('event_name',function(arg1,arg2){//回调参数接收事件参数
        console.log('event_name 1 with two arguments',arg1,arg2);
    });
    
    //为相同事件注册第二个事件监听器
    eventEmitter.on('event_name',function(arg1,arg2,arg3){
        console.log('event_name 2 with three arguments',arg1,arg2,arg3);
    });
    
    //为相同事件注册第三个事件监听器
    eventEmitter.on('event_name',function(){
        console.log('event_name 3 without  argument');
    });
    
    eventEmitter.emit('event_name');//触发事件
    console.log('----------');
    
    setTimeout(function(){
    	eventEmitter.emit('event_name','参数1','参数2');//触发事件,包含事件参数
    
    },1000);
    
    
    
      运行结果
    >node EventEmitterDemo.js
    event_name 1 with two arguments undefined undefined
    event_name 2 with three arguments undefined undefined undefined
    event_name 3 without  argument
    ----------
    event_name 1 with two arguments 参数1 参数2
    event_name 2 with three arguments 参数1 参数2 undefined
    event_name 3 without  argument
     

  2. EventEmitter类方法,EventEmitter实例方法与事件
    EventEmitter.js内容如
    var events = require('events');
    
    var eventEmitter = new events.EventEmitter();
    /*--------------事件---------------*/
    //EventEmitter内置事件,程序异常触发error事件,没有监听器Node.js输出错误并退出
    //建议为会触发error事件的对象添加监听器,避免整个程序奔溃
    eventEmitter.on('error',function(){
    	console.log('error catched');
    });
    eventEmitter.emit('error');
    //EventEmitter内置事件,eventEmitter实例移除监听器时removeListener事件会被触发
    eventEmitter.on('removeListener',function(event,fn){
    	console.log('remove a Listener',event,fn);
    });
    //EventEmitter内置事件,eventEmitter实例添加新的监听器时newListener事件会被触发
    eventEmitter.on('newListener',function(event,fn){
    	console.log('add new Listener',event,fn);
    });
    
    
    /*--------------类方法----------------*/
    //返回eventEmitter实例指定事件的监听器个数
    var event_name_count = events.EventEmitter.listenerCount(eventEmitter,'event_name');
    var remove_listener_count = events.EventEmitter.listenerCount(eventEmitter,'removeListener');
    console.log('event_name_count:' + event_name_count, 'remove_listener_count:' + remove_listener_count);
    
    /*--------------方法----------------*/
    //单个事件的监听器数量默认为10,超出会有警告信息,可以提高监听器默认限制的数量
    eventEmitter.setMaxListeners(3);
    
    //注册一个监听器
    eventEmitter.on('event_name',function(arg1){
    	console.log('this is a listener added by on with argument',arg1);
    });
    //注册监听器到监听器数组的尾部
    eventEmitter.addListener('event_name',function(arg1,arg2){
    	console.log('this is a listener added by addListener with arguments',arg1,arg2);
    });
    //注册一个单次监听器,被触发后先触发removeListener事件后再执行本监听器,最后移除本监听器
    eventEmitter.once('event_name',function(){
        console.log('this is a listener added by once');
    });
    
    
    var eventHandler = function(){
    	console.log('this is a listener with a name eventHandler');
    };
    eventEmitter.on('event_name',eventHandler);
    
    console.log('------------------event_name事件的监听器数组-------------');
    //返回指定事件的监听器数组
    var eventListenersArray = eventEmitter.listeners('event_name');
    console.log(eventListenersArray);
    
    console.log('-------------------触发event_name事件---------------------');
    //触发监听事件,有监听器返回true,否则返回false
    var hasEventHandler = eventEmitter.emit('event_name','参数1','参数2');
    console.log('hasEventHandler:' + hasEventHandler);
    
    setTimeout(function(){
    	eventEmitter.emit('event_name');
    },1000);
    
    console.log('---------------------------------------------');
    var event_name_count = events.EventEmitter.listenerCount(eventEmitter,'event_name');
    var remove_listener_count = events.EventEmitter.listenerCount(eventEmitter,'removeListener');
    console.log('event_name_count:' + event_name_count, 'remove_listener_count:' + remove_listener_count);
    
    console.log('-----------------移除eventHandler监听器----------------------');
    //移除指定监听器
    eventEmitter.removeListener('event_name',eventHandler);
    
    
    var event_name_count = events.EventEmitter.listenerCount(eventEmitter,'event_name');
    var remove_listener_count = events.EventEmitter.listenerCount(eventEmitter,'removeListener');
    console.log('event_name_count:' + event_name_count, 'remove_listener_count:' + remove_listener_count);
    
    console.log('----------------移除event_name事件所有监听器-------------------');
    //移除指定事件的所有监听器
    eventEmitter.removeAllListeners('event_name');
    var event_name_count = events.EventEmitter.listenerCount(eventEmitter,'event_name');
    var remove_listener_count = events.EventEmitter.listenerCount(eventEmitter,'removeListener');
    console.log('event_name_count:' + event_name_count, 'remove_listener_count:' + remove_listener_count);
    
    console.log('---------------移除eventEmitter实例所有监听器-----------------------');
    //移除所有的监听器
    eventEmitter.removeAllListeners();
    var event_name_count = events.EventEmitter.listenerCount(eventEmitter,'event_name');
    var remove_listener_count = events.EventEmitter.listenerCount(eventEmitter,'removeListener');
    console.log('event_name_count:' + event_name_count, 'remove_listener_count:' + remove_listener_count);
    
    
    
    
     运行结果如
    >node EventEmitter.js
    error catched
    event_name_count:0 remove_listener_count:1
    add new Listener event_name function (arg1){
            console.log('this is a listener added by on with argument',arg1);
    }
    add new Listener event_name function (arg1,arg2){
            console.log('this is a listener added by addListener with arguments',ar
    1,arg2);
    }
    add new Listener event_name function (){
        console.log('this is a listener added by once');
    }
    add new Listener event_name function (){
            console.log('this is a listener with a name eventHandler');
    }
    ------------------event_name事件的监听器数组-------------
    [ [Function],
      [Function],
      { [Function: g] listener: [Function] },
      [Function: eventHandler] ]
    -------------------触发event_name事件---------------------
    this is a listener added by on with argument 参数1
    this is a listener added by addListener with arguments 参数1 参数2
    remove a Listener event_name function (){
        console.log('this is a listener added by once');
    }
    this is a listener added by once
    this is a listener with a name eventHandler
    hasEventHandler:true
    ---------------------------------------------
    event_name_count:3 remove_listener_count:1
    -----------------移除eventHandler监听器----------------------
    remove a Listener event_name function (){
            console.log('this is a listener with a name eventHandler');
    }
    event_name_count:2 remove_listener_count:1
    ----------------移除event_name事件所有监听器-------------------
    remove a Listener event_name function (arg1,arg2){
            console.log('this is a listener added by addListener with arguments',ar
    1,arg2);
    }
    remove a Listener event_name function (arg1){
            console.log('this is a listener added by on with argument',arg1);
    }
    event_name_count:0 remove_listener_count:1
    ---------------移除eventEmitter实例所有监听器-----------------------
    remove a Listener error function (){
            console.log('error catched');
    }
    remove a Listener newListener function (event,fn){
            console.log('add new Listener',event,fn);
    }
    event_name_count:0 remove_listener_count:0
    (node:26660) Warning: Possible EventEmitter memory leak detected. 4 event_name
    isteners added. Use emitter.setMaxListeners() to increase limit
    
    
     
分享到:
评论

相关推荐

    node.js中的events.EventEmitter.listenerCount方法使用说明

    EventEmitter.listenerCount(emitter, event) 接收参数: emitter 事件发射器 event 事件 例子: 代码如下: if(events.EventEmitter.listenerCount(this, ‘feedback’) == 0) {  //…. } 源码: 代码如下: ...

    Node.js EventEmitter

    Node.js EventEmitter Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。 Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会...

    关于Node.js的events.EventEmitter用法介绍

    Node.js中使用事件驱动的方式进行编程,events模块提供了一个核心的功能,即EventEmitter类。这个类用于处理事件发射和监听,是实现Node.js事件驱动编程模式的基础。 EventEmitter的核心概念包括事件发射和事件监听...

    10.node.js.rar

    4. **事件与回调**:深入解析事件循环和事件监听器的工作原理,如何使用`EventEmitter`类处理事件。 5. **非阻塞I/O**:通过实例演示如何实现非阻塞I/O操作,理解异步编程的概念。 6. **文件系统操作**:展示了Node....

    前端项目-EventEmitter.zip

    "前端项目-EventEmitter.zip"是一个专注于浏览器环境下的事件处理库,它实现了EventEmitter模式,使得JavaScript代码可以通过发布和订阅事件来实现组件之间的通信。下面我们将详细探讨EventEmitter及其在前端项目中...

    EventEmitter:node.js的EventEmitter模块的事件模型源码-js

    事件发射器node.js的EventEmitter模块的事件模型源码================================================分析源码1.外部(function(){})(window)为匿名函数,并插入的窗口2.用var定义局部变量EventEmitter,并用...

    Node.js初级+进阶

    `EventEmitter`类是Node.js内置的事件处理类,常用于实现事件驱动编程。 ### 5. 异步IO操作 Node.js的异步I/O是通过回调函数来实现的,避免了阻塞主线程,提高了程序的运行效率。`fs`模块提供了文件系统的异步操作...

    node-abort-controller:基于EventEmitter的Node.JS的AbortController Polyfill

    节点异常终止控制器基于EventEmitter的Node.JS的AbortController Polyfill用法import fetch from 'node-fetch'import AbortController from 'node-abort-controller'const controller = new AbortController ( )...

    Node.js-一个事件总线框架用于事件驱动编程

    在 Node.js 中,内置的 `events` 模块提供了 EventEmitter 类,它是实现事件驱动的基础。EventEmitter 允许对象发射(emit)事件并让其他对象监听(listen)这些事件。当事件被发射时,监听该事件的函数会被调用,...

    最新nodejs安装包 v8.12.0-linux-x64.tar.xz

    eventEmitter.on('data_received', function(){ console.log('数据接收成功。'); }); // 创建事件处理程序 var connectHandler = function connected() { console.log('连接成功。'); // 触发 data_received ...

    前端大厂最新面试题-EventEmitter.docx

    EventEmitter 是 Node.js 中实现事件驱动机制的基础,几乎所有的模块都继承了这个类。EventEmitter 的实例可以分发事件,并且拥有自己的事件,可以绑定/触发监听器,实现了异步操作。 Node.js 里面的许多对象都会...

    跟我学Nodejs(二)--- Node.js事件模块

    Node.js的事件模块提供了单一的核心对象,即events.EventEmitter类。通过这个类,我们可以实例化EventEmitter对象并使用它来监听和发射事件。EventEmitter类的核心操作包括事件监听和事件发射。 事件监听是通过...

    Professional Node.js Building Javascript Based Scalable Software

    - 详细讲解了Node.js中的事件驱动模型,特别是`EventEmitter`类。 - 展示了如何利用事件驱动来构建响应式和高效的程序。 - **使用定时器安排函数执行**(第6章) - 讨论了定时器在异步编程中的作用,包括`...

    Node.js中使用事件发射器模式实现事件绑定详解

    在Node.js中,事件发射器通常是通过继承`events`模块中的`EventEmitter`类来实现的。一个事件发射器对象可以发射多个类型的事件,并允许任何数量的监听器注册到其上。一旦事件发射器触发一个事件,所有注册到该事件...

    Node.js-EventBusOttoRxBus事件总线使用

    使用EventBus,开发者可以定义事件类,然后在需要发送事件的地方调用`EventBus.getDefault().post(event)`,在接收端使用`@Subscribe`注解的方法处理事件。 2. **Otto** Otto是Square公司为Android开发的事件总线库...

    Node.js快速学习入门

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行开发,极大地推动了全栈开发的流行。本教程旨在为初学者提供一个快速学习 Node.js 的入口,帮助你从零开始...

    node.js api

    Node.js API是JavaScript的运行环境Node.js的核心部分,它提供了一系列用于开发服务器端应用的API。Node.js采用事件驱动、非阻塞IO模型,使其轻量又高效,非常适合处理大量并发请求。以下将详细介绍Node.js API的...

Global site tag (gtag.js) - Google Analytics