关于Node.js的events.EventEmitter用法介绍


Posted in Javascript onApril 01, 2017

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

Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
EventEmitter 类

events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。

你可以通过require(“events”);来访问该模块。

// 引入 events 模块 
var events = require('events'); 
// 创建 eventEmitter 对象 
var eventEmitter = new events.EventEmitter();

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

下面我们用一个简单的例子说明 EventEmitter 的用法:

//event.js 文件 
var EventEmitter = require('events').EventEmitter;  
var event = new EventEmitter();  
event.on('some_event', function() {  
  console.log('some_event 事件触发');  
});  
setTimeout(function() {  
  event.emit('some_event');  
}, 1000);

执行结果如下:

运行这段代码,1 秒后控制台输出了 ‘some_event 事件触发'。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用some_event 的监听器。

$ node event.js

some_event 事件触发

EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。

当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。

让我们以下面的例子解释这个过程:

//event.js 文件 
var events = require('events');  
var emitter = new events.EventEmitter();  
emitter.on('someEvent', function(arg1, arg2) {  
  console.log('listener1', arg1, arg2);  
});  
emitter.on('someEvent', function(arg1, arg2) {  
  console.log('listener2', arg1, arg2);  
});  
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数');

执行以上代码,运行的结果如下:

$ node event.js

listener1 arg1 参数 arg2 参数

listener2 arg1 参数 arg2 参数

以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后触发了 someEvent 事件。

运行结果中可以看到两个事件监听器回调函数被先后调用。 这就是EventEmitter最简单的用法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个JavaScript继承的实现
Oct 24 Javascript
javascript 写类方式之十
Jul 05 Javascript
ASP.NET jQuery 实例1(在TextBox里面创建一个默认提示)
Jan 13 Javascript
js 动态加载事件的几种方法总结
Dec 25 Javascript
jquery中each方法示例和常用选择器
Jul 08 Javascript
jquery实现多屏多图焦点图切换特效的方法
May 04 Javascript
Node.js静态文件服务器改进版
Jan 10 Javascript
Javascript基础_简单比较undefined和null 值
Jun 14 Javascript
vue + socket.io实现一个简易聊天室示例代码
Mar 06 Javascript
Swiper实现轮播图效果
Jul 03 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
Dec 06 Javascript
简述vue路由打开一个新的窗口的方法
Nov 29 Javascript
ES6 Promise对象概念与用法分析
Apr 01 #Javascript
JavaScript中闭包的详解
Apr 01 #Javascript
基于JavaScript实现验证码功能
Apr 01 #Javascript
AngularJS1.X学习笔记2-数据绑定详解
Apr 01 #Javascript
Angularjs使用指令做表单校验的方法
Mar 31 #Javascript
JS正则获取HTML元素的方法
Mar 31 #Javascript
JS+CSS实现下拉刷新/上拉加载插件
Mar 31 #Javascript
You might like
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
javascript正则表达式中分组详解
2016/07/17 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
js正则表达式验证密码强度【推荐】
2017/03/03 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
jQuery实现拖动效果的实例代码
2017/06/25 jQuery
微信小程序学习之数据处理详解
2017/07/05 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
Python命名空间的本质和加载顺序
2018/12/17 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
Python之京东商品秒杀的实现示例
2021/01/06 Python
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
Puritan’s Pride(普丽普莱)官方网站:美国最大最全的保健品公司之一
2016/10/23 全球购物
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
《商鞅南门立木》教学反思
2014/02/16 职场文书
党员岗位承诺书
2014/03/25 职场文书
银行内勤岗位职责
2014/04/09 职场文书
工作犯错保证书
2015/05/11 职场文书
导游词之无锡唐城
2019/12/12 职场文书
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB