nodejs中的事件events
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相关推荐
- 理解浏览器和nodeJs中的事件循环(Event Loop)
浏览器环境下 js 引擎的事件循环机制 js 引擎每次只能执行一个操作,而通常情况下操作又不止一个,因此这些操作会被依次放入一个队列中,js 引擎会按照队列中的顺序去执行操作,这个队列叫做执行栈. 当 ...
- 【nodejs原理源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
[摘要] 官网博文翻译,nodejs中的定时器 示例代码托管在:http://www.github.com/dashnowords/blogs 原文地址:https://nodejs.org/en/d ...
- nodejs中events模块的使用
nodejs中events的基本使用 讲events之前我们先用js模拟实现一个EventEmitter类 源码 //订阅者集合 class EventEmitter{constructor(){th ...
- nodejs中使用worker_threads来创建新的线程
文章目录 简介 worker_threads isMainThread MessageChannel parentPort和MessagePort markAsUntransferable SHARE ...
- 处理 react_【学习教程】React 中阻止事件冒泡的问题
来源 | https://www.cnblogs.com/Wayou/p/react_event_issue.html 在正式开始前,先来看看 js 中事件的触发与事件处理器的执行. js 中事件的监 ...
- 这就是为什么我们需要在React的类组件中绑定事件处理程序
by Saurabh Misra 索拉·米斯拉(Saurabh Misra) 这就是为什么我们需要在React的类组件中绑定事件处理程序 (This is why we need to bind ev ...
- echarts y轴添加点击事件_ECharts中的事件和行为
用户在操作 Echarts 的图表时会触发相应的事件,这些事件由开发者监听,然后回调函数做出相应的处理,可以弹出一个对话框.跳转到一个地址或者做数据下钻等等. ECharts 3 中绑定事件跟 Ech ...
- mysql originator_MySQL中的事件调度器EVENT
MySQL中的事件调度器,EVENT,也叫定时任务,类似于Unix crontab或Windows任务调度程序. EVENT由其名称和所在的schema唯一标识. EVENT根据计划执行特定操作.操作 ...
- nodeJS中读写文件方法的区别
导言:nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三 ...
最新文章
- Android SpannableString 给TextView 设置颜色,删除线等
- centos下pg_dump的服务器版本不匹配问题
- Python检查系统可疑用户
- 原来这就是Java代码生成器的原理啊,太简单了
- Gartner:全球IT未来十年热门技术TOP10
- Android重写FragmentTabHost来实现状态保存
- 《ES6标准入门》49~68Page 数值的拓展 数组的拓展
- 第一次scrum冲刺
- java.library.path到底指什么
- TCP/IP,Http,Socket,XMPP的区别
- 如何在Mac上快速签署PDF
- C++ wchar_t转char
- MySQL table 添加_「primarykey」MySQL中为table添加primary key的两种方法 - seo实验室
- IOTOS物联中台对接海康安防平台(iSecure Center)门禁系统
- 干货分享:手游运营活动如何提升收入
- 设置水平线高度html代码是size,html水平线样式 Width:设置水平线的宽度
- 【逆向】i春秋入门实战——crack_me
- 在这领工资,一辈子别想取媳妇了!
- android显示视频预览
- 美团企业版:地利尚可,天时不足
热门文章
- 计算机网络——路由器接口及静态路由配置
- 怎么把微信公众号的文章里的音频或视频下载到电脑和手机
- 微信公众号文章怎么插附件
- IO多路复用之epoll总结 http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html
- 制作一个简单HTML西安旅游网页(HTML+CSS)
- 营销第一人:富军相信网络营销神器能够“博”出未来
- 腾讯微信客服电话怎么直接人工服务呢
- HR面试,你需要注意什么?
- 乌镇时间到,创宇云端安全治理体系即将亮相世界互联网大会
- 键盘录入一个字符串,统计该字符串中的大写字母、小写字母、数字字符和其他字符分别有多少个 例如,键盘录入abcABCD12345!@#$%,输出结果为:小写字母有3个,大写字母有4个,数字字符有5个,