Node.js EventEmmitter事件监听器用法实例分析


Posted in Javascript onJanuary 07, 2019

本文实例讲述了Node.js EventEmmitter事件监听器用法。分享给大家供大家参考,具体如下:

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
该模块已被node.js默认引,不需要使用require()显示引入。

EventEmitter 对象如果在实例化时发生错误,会触发 ‘error' 事件。当添加新的监听器时,'newListener' 事件会触发,当监听器被移除时,'removeListener' 事件被触发。

一、on(event, listener)

为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。

var myEvent = new events.EventEmitter();
var listener = function() {
  console.log('someEvent emit');
}
myEvent.on('someEvent', listener);
//这里是lambda表达式
setTimeout(() => myEvent.emit('someEvent'), 1000);

EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

var myEvent = new events.EventEmitter();
myEvent.on('someEvent', function(arg1,arg2) { console.log('someEvent 1 emit', arg1, arg2);});
myEvent.on('someEvent', (arg1,arg2) => console.log('someEvent 2 emit', arg1, arg2));
myEvent.emit('someEvent', 'arg1', 'arg2');
/*
输出
someEvent 1 emit arg1 arg2
someEvent 2 emit arg1 arg2
*/

二、once(event, listener)

为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。

var myEvent = new events.EventEmitter();
myEvent.once('someEvent', function () {
  console.log('someEvent emit');
});
myEvent.emit('someEvent');
/*
返回 true
输出 someEvent emit
*/
myEvent.emit('someEvent');
//返回 false

三、removeListener(event, listener)

移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。

var myEvent = new events.EventEmitter();
var listener = () => console.log('someEvent emit');
myEvent.on('someEvent', listener);
myEvent.removeListener('someEvent', listener);
myEvent.emit('someEvent');
//返回 false

四、removeAllListeners([event])

移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。

五、setMaxListeners(n)

默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。

六、listenerCount(emitter, event)

返回指定事件的监听器数量。

var myEvent = new events.EventEmitter();
myEvent.listenerCount();
//输出 0
events.EventEmitter.listenerCount(myEvent);
//输出 0
events.EventEmitter.listenerCount(myEvent, 'someEvent');
//输出 0
myEvent.on('someEvent', () => console.log('someEvent emit'));
myEvent.listenerCount();
//输出 0
events.EventEmitter.listenerCount(myEvent);
//输出 0
events.EventEmitter.listenerCount(myEvent, 'someEvent');
//输出 1

七、error 事件

EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。
当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。
我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。

var myEvent = new events.EventEmitter();
myEvent.on('uncaughtException', (err) => {
 console.log('whoops! there was an error');
});
myEvent.emit('error', new Error('whoops!'));
//输出 Error: whoops!
myEvent.on('error', (err) => {
 console.log('whoops! there was an error');
});
myEvent.emit('error', new Error('whoops!'));
//输出 whoops! there was an error

注意

大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。

为什么要这样做呢?原因有两点:

1. 具有某个实体功能的对象实现事件符合语义, 事件的监听和发射应该是一个对象的方法。
2. JavaScript 的对象机制是基于原型的,支持 部分多重继承,继承 EventEmitter 不会打乱对象原有的继承关系。

Events(事件)模块是Node.js的核心,许多其他模块用它来围绕着事件架构功能。由于Node.js运行在单一的线程中,任何同步代码都是阻塞的,所以如果有长时间运行的代码的话事件循环便会被阻塞。为了有效地使用Node.js编写代码,必须仔细思考自己的变成风格并遵循一些简单的规则。

  • 别阻塞——Node.js是单线程的,如果代码阻塞的话所有其他的一切都会停止。
  • 快速返回——操作应当快速返回。如果不能快速返回,就应道将其移到另一个进程中。

希望本文所述对大家nodejs程序设计有所帮助。

Javascript 相关文章推荐
javascript 进阶篇2 CSS XML学习
Mar 14 Javascript
jQuery.validate 常用方法及需要注意的问题
Mar 20 Javascript
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
原生js和jQuery随意改变div属性style的名称和值
Oct 22 Javascript
jQuery+html5实现div弹出层并遮罩背景
Apr 15 Javascript
JavaScript中的Math.LOG2E属性使用详解
Jun 14 Javascript
JS+Canvas绘制时钟效果
Aug 20 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
Jun 17 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
Feb 27 Javascript
小程序getLocation需要在app.json中声明permission字段
Apr 04 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
Aug 20 Javascript
实用的 vue tags 创建缓存导航的过程实现
Dec 03 Vue.js
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
Jan 07 #Javascript
jQuery实现的别踩白块小游戏完整示例
Jan 07 #jQuery
jQuery判断自定义属性data-val用法示例
Jan 07 #jQuery
jQuery实现的简单歌词滚动功能示例
Jan 07 #jQuery
微信小程序发送短信验证码完整实例
Jan 07 #Javascript
JS数组求和的常用方法实例小结
Jan 07 #Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 #Javascript
You might like
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
2014/10/14 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
超级退弹代码
2008/07/07 Javascript
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
jQuery中addClass()方法用法实例
2015/01/05 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
Vue组件化通讯的实例代码
2017/06/23 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
如何使node也支持从url加载一个module详解
2018/06/05 Javascript
vue-router启用history模式下的开发及非根目录部署方法
2018/12/23 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
使用Protocol Buffers的C语言拓展提速Python程序的示例
2015/04/16 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
基于python 凸包问题的解决
2020/04/16 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
Delphi笔试题
2016/11/14 面试题
楼面经理岗位职责范本
2014/02/18 职场文书
活动总结书
2014/05/08 职场文书
护理医院见习报告
2014/11/03 职场文书
2015年电教工作总结
2015/05/26 职场文书
高一化学教学反思
2016/02/22 职场文书
Python绘制散乱的点构成的图的方法
2022/04/21 Python