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 日期处理之时区问题
Oct 08 Javascript
jquery中输入验证中一个不错的效果
Aug 21 Javascript
JavaScript的事件代理和委托实例分析
Mar 25 Javascript
js生成随机数的过程解析
Nov 24 Javascript
JS把内容动态插入到DIV的实现方法
Jul 19 Javascript
实例解析jQuery工具函数
Dec 01 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
微信小程序使用Socket的实例
Sep 19 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
Aug 10 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
Nov 15 Javascript
Vue实现Layui的集成方法步骤
Apr 10 Javascript
vue-socket.io接收不到数据问题的解决方法
May 13 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
php获取excel文件数据
2017/04/21 PHP
js验证表单第二部分
2006/11/25 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
JavaScript入门系列之知识点总结
2016/03/24 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
python基于itchat模块实现微信防撤回
2019/04/29 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
keras 多任务多loss实例
2020/06/22 Python
台湾旅游网站:灿星旅游
2018/10/11 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
销售冠军获奖感言
2014/02/03 职场文书
校庆接待方案
2014/03/18 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python