在模块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. 谈谈css3的字体大小单位[rem]

    最近接收了一份面试题,内容是移动端传播的H5(在中国通常这么叫)广告页. 秉承移动端web尽量少用px的概念,我使用rem进行了一次重构.对于rem,基本是给 html/body 元素定义一个字体大小 ...

  2. javascript实现倒计时

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  3. MySqL触发器以及常用转换函数注意事项

    1,触发器(http://www.cnblogs.com/zzwlovegfj/archive/2012/07/04/2576989.html)       1.MYSQL中触发器中不能对本表进行 i ...

  4. c++常用IDE

    vs2013. CodeLite (c/c++/PHP) codeBlocks Qt Creator Xcode

  5. php curl_exec optimize

    需求:前端过来一个请求,后台php要通过两次http请求,请求不同的地址得到资源后拼接返回给前端 请求A站: 请求B站: 同时请求A站和B站(php 串行 curl_exec ) 同时请求A站和B站( ...

  6. js获取当前url参数的两方式

    方法一:正则分析法function getQueryString(name) {    var reg = new RegExp("(^|&)" + name + &quo ...

  7. ora-14550问题解决

    select a.sid, a.serial#, a.paddr, 'alter system kill session ''' || a.sid || ',' || a.serial# || ''' ...

  8. Oracle数据库的启动和关闭

    深刻理解Oracle数据库的启动和关闭 Oracle数据库提供了几种不同的数据库启动和关闭方式,本文将详细介绍这些启动和关闭方式之间的区别以及它们各自不同的功能. 一.启动和关闭Oracle数据库 对 ...

  9. hadoop笔记之Hive的数据存储(分区表)

    Hive的数据存储(分区表) Hive的数据存储(分区表) 分区表 Partition对应于数据库的Partition列的密集索引 在Hive中,表中的一个Partition对应于表下的一个目录,所有 ...

  10. Android studio 查看sha1

    高德地图开发申请KEY的时候需要开发者提供SHA1证书指纹数据,在eclipse很容易就找到了,但是Android Studio很久也没找到,只能使用在网上看到的方法了,在Android Studio ...