1.Events

例子,一个绑定了一个监听器的 EventEmitter 实例。 eventEmitter.on() 方法用于注册监听器,eventEmitter.emit() 方法用于触发事件。

const EventEmitter  = require('events');class MyEmitter extends EventEmitter {}const myEimitter = new MyEmitter;
myEimitter.on('event', () => {console.log("触发了一个事件!")
});
myEimitter.emit('event');

2.给监听器传入参数与 this

eventEmitter.emit() 方法允许将任意参数传给监听器函数。 当一个普通的监听器函数被 EventEmitter 调用时,标准的 this 关键词会被设置指向监听器所附加的 EventEmitter。

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}const myEmitter = new MyEmitter();
myEmitter.on('event', function (a, b) {console.log(a, b, this);});
myEmitter.emit('event', 'a', 'b');
// Prints:
//   a b MyEmitter {//     domain: null,
//     _events: { event: [Function] },
//     _eventsCount: 1,
//     _maxListeners: undefined }

可以使用 ES6 的箭头函数作为监听器。但是这样 this 关键词就不再指向 EventEmitter 实例:

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}const myEmitter = new MyEmitter();
myEmitter.on('event', (a, b) =>{console.log(a, b, this);});
myEmitter.emit('event', 'a', 'b');
// Print: a b {}

3.只处理事件一次

当使用 eventEmitter.on() 方法注册监听器时,监听器会在每次触发命名事件时被调用。 也可以使用 ES6 的箭头函数作为监听器。但是这样 this 关键词就不再指向 EventEmitter 实例:

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}const  myEmitter = new MyEmitter();
let m = 0;
myEmitter.on('event', () => {console.log(++m);
});
myEmitter.emit('event');
// Prints: 1
myEmitter.emit('event');
// Prints: 2

使用这个eventEmitter.once()方法,可以注册一个最多被调用一次的特定事件的监听器。一旦事件发出,监听器就被取消注册,然后被调用。

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}const  myEmitter = new MyEmitter();
let m = 0;
myEmitter.once('event', () => {console.log(++m);
});
myEmitter.emit('event');
// Prints: 1
myEmitter.emit('event');
// Ignored

4.错误事件

使用这个eventEmitter.once()方法,可以注册一个最多被调用一次的特定事件的监听器。一旦事件发出,监听器就被取消注册,然后被调用。

const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}const  myEmitter = new MyEmitter();
myEmitter.on('error', (error) => {console.log('whoops! There was an error.')
});
myEmitter.emit('error' , new Error('whoops!'));

5.事件newlistener

该EventEmitter实例将发出它自己的’newListener’事件之前 的侦听器添加到其内部的监听者数组。
注册了’newListener’事件的监听器将被传递事件名称和引用被添加的监听器。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
// Only do this once so we don't loop forever
myEmitter.once('newListener', (event, listener) => {if (event === 'event') {//嵌入一个新的监听器myEmitter.on('event', () => {console.log('B');});}
});
myEmitter.on('event', () => {console.log('A');
});
myEmitter.emit('event');
// Prints:
//   B
//   A

6.listenerCount

一个类方法,返回给定eventName 注册给定的给定的监听器的数量emitter。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(EventEmitter.listenerCount(myEmitter, 'event'));
// Print: 3

7.emitter.eventNames()

一个类方法,返回给定eventName 注册给定的给定的监听器的数量emitter。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(EventEmitter.listenerCount(myEmitter, 'event'));
// Print: 3

8.emitter.listeners(eventName)

返回名为的事件的侦听器数组的副本eventName。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
server.on('connection', (stream) => {console.log('Someone connected!');
});
console.log(util.inspect(server.listeners('connection')));

9.emitter.on(eventName,listener)

默认情况下,事件侦听器按照它们添加的顺序被调用。该 emitter.prependListener()方法可以用作将侦听器添加到侦听器数组开头的替代方法。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEE = new MyEmitter();
myEE.on('foo', () => { console.log('a') });
myEE.prependListener('foo', () => { console.log('b') });
myEE.emit('foo');
// Print: B
// Print: A

10.emitter.removeListener(eventName,listener)

removeListener将从监听器数组中最多删除一个监听器实例。如果任何单个侦听器已多次添加到指定的侦听器数组中eventName,则removeListener必须多次调用以删除每个实例。

const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter  = new MyEmitter();const callbackA = () => {console.log('A');myEmitter.removeListener('event', callbackB)
};const callbackB = () => {console.log('B');
};myEmitter.on('event', callbackA);myEmitter.on('event', callbackB);// callbackA removes listener callbackB but it will still be called
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Print: A
// Print: B// callbackB is now removed
// Internal listener array [callbackA]
myEmitter.emit('event');
// Print: A

nodejs中的事件events相关推荐

  1. 理解浏览器和nodeJs中的事件循环(Event Loop)

    浏览器环境下 js 引擎的事件循环机制 js 引擎每次只能执行一个操作,而通常情况下操作又不止一个,因此这些操作会被依次放入一个队列中,js 引擎会按照队列中的顺序去执行操作,这个队列叫做执行栈. 当 ...

  2. 【nodejs原理源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick

    [摘要] 官网博文翻译,nodejs中的定时器 示例代码托管在:http://www.github.com/dashnowords/blogs 原文地址:https://nodejs.org/en/d ...

  3. nodejs中events模块的使用

    nodejs中events的基本使用 讲events之前我们先用js模拟实现一个EventEmitter类 源码 //订阅者集合 class EventEmitter{constructor(){th ...

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

    文章目录 简介 worker_threads isMainThread MessageChannel parentPort和MessagePort markAsUntransferable SHARE ...

  5. 处理 react_【学习教程】React 中阻止事件冒泡的问题

    来源 | https://www.cnblogs.com/Wayou/p/react_event_issue.html 在正式开始前,先来看看 js 中事件的触发与事件处理器的执行. js 中事件的监 ...

  6. 这就是为什么我们需要在React的类组件中绑定事件处理程序

    by Saurabh Misra 索拉·米斯拉(Saurabh Misra) 这就是为什么我们需要在React的类组件中绑定事件处理程序 (This is why we need to bind ev ...

  7. echarts y轴添加点击事件_ECharts中的事件和行为

    用户在操作 Echarts 的图表时会触发相应的事件,这些事件由开发者监听,然后回调函数做出相应的处理,可以弹出一个对话框.跳转到一个地址或者做数据下钻等等. ECharts 3 中绑定事件跟 Ech ...

  8. mysql originator_MySQL中的事件调度器EVENT

    MySQL中的事件调度器,EVENT,也叫定时任务,类似于Unix crontab或Windows任务调度程序. EVENT由其名称和所在的schema唯一标识. EVENT根据计划执行特定操作.操作 ...

  9. nodeJS中读写文件方法的区别

    导言:nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三 ...

最新文章

  1. Android SpannableString 给TextView 设置颜色,删除线等
  2. centos下pg_dump的服务器版本不匹配问题
  3. Python检查系统可疑用户
  4. 原来这就是Java代码生成器的原理啊,太简单了
  5. Gartner:全球IT未来十年热门技术TOP10
  6. Android重写FragmentTabHost来实现状态保存
  7. 《ES6标准入门》49~68Page 数值的拓展 数组的拓展
  8. 第一次scrum冲刺
  9. java.library.path到底指什么
  10. TCP/IP,Http,Socket,XMPP的区别
  11. 如何在Mac上快速签署PDF
  12. C++ wchar_t转char
  13. MySQL table 添加_「primarykey」MySQL中为table添加primary key的两种方法 - seo实验室
  14. IOTOS物联中台对接海康安防平台(iSecure Center)门禁系统
  15. 干货分享:手游运营活动如何提升收入
  16. 设置水平线高度html代码是size,html水平线样式 Width:设置水平线的宽度
  17. 【逆向】i春秋入门实战——crack_me
  18. 在这领工资,一辈子别想取媳妇了!
  19. android显示视频预览
  20. 美团企业版:地利尚可,天时不足

热门文章

  1. 计算机网络——路由器接口及静态路由配置
  2. 怎么把微信公众号的文章里的音频或视频下载到电脑和手机
  3. 微信公众号文章怎么插附件
  4. IO多路复用之epoll总结 http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html
  5. 制作一个简单HTML西安旅游网页(HTML+CSS)
  6. 营销第一人:富军相信网络营销神器能够“博”出未来
  7. 腾讯微信客服电话怎么直接人工服务呢
  8. HR面试,你需要注意什么?
  9. 乌镇时间到,创宇云端安全治理体系即将亮相世界互联网大会
  10. 键盘录入一个字符串,统计该字符串中的大写字母、小写字母、数字字符和其他字符分别有多少个 例如,键盘录入abcABCD12345!@#$%,输出结果为:小写字母有3个,大写字母有4个,数字字符有5个,