关于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 相关文章推荐
通过下拉框的值来确定输入框是否可以为空的代码
Oct 18 Javascript
JS的事件绑定深入认识
Jun 26 Javascript
JavaScript实现常用二级省市级联下拉列表的方法
Mar 25 Javascript
jQuery实现网站添加高亮突出显示效果的方法
Jun 26 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
微信jssdk用法汇总
Jul 16 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
May 10 Javascript
JS 实现分页打印功能
May 16 Javascript
微信小程序带动画弹窗组件使用方法详解
Nov 27 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
Jul 18 Javascript
Angular短信模板校验代码
Sep 23 Javascript
小程序实现文字循环滚动动画
Jun 14 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
一个简洁的多级别论坛
2006/10/09 PHP
Laravel 默认邮箱登录改成用户名登录的实现方法
2019/08/12 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
javascript动态加载二
2012/08/22 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
在Vue中使用Compass的方法
2018/03/02 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
vue项目中全局引入1个.scss文件的问题解决
2019/08/01 Javascript
element ui分页多选,翻页记忆的实例
2019/09/03 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
python批量爬取下载抖音视频
2019/06/17 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
2020/02/26 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
如何在python中处理配置文件代码实例
2020/09/27 Python
Django websocket原理及功能实现代码
2020/11/14 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
Linux面试题LINUX系统类
2015/11/25 面试题
30年同学聚会感言
2014/01/30 职场文书
旷课检讨书1000字
2014/02/14 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
师德培训心得体会2016
2016/01/09 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL