在模块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');

nodejs中EventEmitter的更多相关文章

  1. nodejs 中自定义事件

    经常看到 req.on('error', function(){...}); 这种代码. 在nodejs中,可以使用 EventEmitter来实现. 具体的关键词有如下几个: var reqEven ...

  2. nodejs中Stream的理解

    在nodejs中可以通过fs模块读写文件,我们来看下fs模块提供的接口: fs.readFile(filename, callback) 异步读取文件. filename是读取文件的文件名,如果是相对 ...

  3. 深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)

    events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中 ...

  4. Nodejs中的流

    Nodejs中的很多地方都用到了流,流是一个很常见的概念,一个http请求,控制台输入输出的形式都是流.流可以分为三种: 可读流 可写流 既能读又能写 其中第三种流又可以分为全双工流Duplex和转换 ...

  5. [NodeJs系列][译]理解NodeJs中的Event Loop、Timers以及process.nextTick()

    译者注: 为什么要翻译?其实在翻译这篇文章前,笔者有Google了一下中文翻译,看的不是很明白,所以才有自己翻译的打算,当然能力有限,文中或有错漏,欢迎指正. 文末会有几个小问题,大家不妨一起思考一下 ...

  6. 理解nodejs中的stream(流)

    阅读目录 一:nodeJS中的stream(流)的概念及作用? 二:fs.createReadStream() 可读流 三:fs.createWriteStream() 可写流 回到顶部 一:node ...

  7. nodeJS中的事件机制

    events模块是node的核心模块,几乎所有常用的node模块都继承了events模块,比如http.fs等.本文将详细介绍nodeJS中的事件机制 EventEmitter 多数 Node.js ...

  8. nodejs中使用worker_threads来创建新的线程

    目录 简介 worker_threads isMainThread MessageChannel parentPort和MessagePort markAsUntransferable SHARE_E ...

  9. 在nodejs中创建child process

    目录 简介 child process 异步创建进程 同步创建进程 在nodejs中创建child process 简介 nodejs的main event loop是单线程的,nodejs本身也维护 ...

随机推荐

  1. 关于Oracle备份中的fractured block

    One danger in making online backups is the possibility of inconsistent data within a block. For exam ...

  2. git https连接方式,记住密码

    Git使用https方式进行连接时,默认每次推送时都要输入用户名和密码. 可以使用命令 $git config credential.helper store 为当前仓库设置记住密码,设置后,只要在推 ...

  3. 相见恨晚——MarkDown

    什么是MarkDown MarkDown是一种轻量级的标记语言 MarkDown使你更加关注文章的内容 MarkDown使文章的排版变得简单直接 什么情景下使用MarkDown 在我们熟悉的githu ...

  4. springFramework 源码学习之源码下载与编译

    1.源码下载 Spring已经将源码从svn迁移到了git.对于习惯了svn的人来说依然可以svn checkout,最好checkout到英文路径下,本人中文路径编译不过,具体原因不明,路径: ht ...

  5. 正选反选JS

    JS <script> window.onload=function(){ var oTher=document.getElementById('other'); var oCheck=d ...

  6. how to install git 1.8 rpm

    git版本在低于1.8之前,对于私有项目会出现401的pull失败错误,只能通过升级git版本来解决 It appears that git18 is no longer available from ...

  7. silverlight imagesource赋值与转换

    介绍几种常用的Image source 赋值方式: this.abc.Source = new BitmapImage(new Uri("/1.jpg", UriKind.Rela ...

  8. Exec sql/c

    Exec sql/c 利用高级语言的过程性结构来弥补SQL语言实现复杂应用方面的不足. 嵌入SQL的高级语言称为主语言或宿主语言. 在混合编程中,SQL语句负责操作数据库,高级语言语句负责控制程序流程 ...

  9. iptsbles及磁盘扩容

    如果你的IPTABLES基础知识还不了解,建议先去看看. 们来配置一个filter表的防火墙 1.查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables -L -n Cha ...

  10. 数学之路-python计算实战(13)-机器视觉-图像增强

    指数变换的基本表达式为:y=bc(x-a)-1 当中參数b.c控制曲线的变换形状,參数a控制曲线的位置. 指数变换的作用是扩展图像的高灰度级.压缩低灰度级.能够用于亮度过高的图像 本博客全部内容是原创 ...