`

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用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

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

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

    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 ( )...

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

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

    微信小程序 Node.js (基础四) 事件循环& (基础五) EventEmitter

    微信小程序 Node.js (基础四) 事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,...Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件,

    Node.js 开发指南.pdf

    第1章 Node.js简介 1 1.1 Node.js是什么 2 1.2 Node.js能做什么 3 1.3 异步式I/O与事件驱动 4 1.4 Node.js的性能 5 1.4.1 Node.js架构简介 5 1.4.2 Node.js与PHP+Nginx 6 1.5 JavaScript简史 6 ...

    Instant Node.js Starter(英文)

    Node.js is a platform that lets you use JavaScript to easily program scalable network applications and web services. Learn about the main concepts behind Node.js to get you started with this exciting ...

    EventEmitter.swift:Node.js v0.12.0 上的 EventEmitter 克隆

    EventEmitter.swift Node.js v0.12.0 上 EventEmitter 的克隆。 符合笔记由于 swift 语言规范,侦听器回调不是可变参数,而是接收一个数组 [Any]。 EventEmitter#removeListener 没有实现,因为 Swift 上的闭包没有...

    global-eventemitter:只是 Node.js EventEmitter 的一个全局实例

    全局 Node.js EventEmitter 只是 Node.js EventEmitter 的一个全局实例

    single-events-eventemitter:Node.js EventEmitter 的简单实例,可在整个应用程序中作为单例使用

    单事件事件发射器 当您必须使用,您必须创建一个EventEmitter实例。 如果模块 B 必须监听从模块 A 发出的事件,您可以简单地在 B 中要求 A 并执行以下操作: moduleA . on ( 'notification' , function ( ) { // Do ...

    从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例

    本文实例讲述了Node.js EventEmitter发送和接收事件的方法。分享给大家供大家参考,具体如下: pulser.js /* EventEmitter发送和接收事件 HTTPServer和HTTPClient类,它们都继承自EventEmitter EventEmitter被...

    Node.js+开发指南

    第1章 Node.js简介 1 1.1 Node.js是什么 2 1.2 Node.js能做什么 3 1.3 异步式I/O与事件驱动 4 1.4 Node.js的性能 5 1.4.1 Node.js架构简介 5 1.4.2 Node.js与PHP+Nginx 6 1.5 JavaScript简史...

    6案例五: [实现一个音乐播放器] Node 的事件机制 - EventEmitter(1).md

    Node 的事件机制 - EventEmitter|7案例六:[图片拷贝小工具] - Node 的编码与缓冲 - Buffer(1)|8案例七:[视频流转 MP3 工具] - Node 数据流和管道 - Streampipe|9案例八:[静态资源服务器] - Node 工具集 - path...

    Node.js 实战

    Node.js是一个非常具有极客精神的技术社区(我更想强调它本身代表的是一个社区,相比之前的一些大语言分支 c/c++/java什么的,那些大语言在针对某一些应用都有很固定的范式去遵循,javascript/node.js还是一个比较...

    node.js中的事件处理机制详解

    所有可能触发事件的对象都是一个集成了EventEmitter类的子类的实例对象,在Node.js中,为EventEmitter类定义了许多方法,所有与对象的事件处理函数的绑定及解除相关的处理均依靠这些方法的调用来执行。 EventEmitter...

    Node.js 事件循环详解及实例

    Node.js 事件循环详解及实例 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常...Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事

Global site tag (gtag.js) - Google Analytics