关于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 相关文章推荐
奇妙的js
Sep 24 Javascript
JavaScript中遍历对象的property的3种方法介绍
Dec 30 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
Sep 11 Javascript
jquery判断iPhone、Android设备类型
Sep 14 Javascript
一个极为简单的requirejs实现方法
Oct 20 Javascript
javascript 数组去重复(在线去重工具)
Dec 17 Javascript
Node.js连接MongoDB数据库产生的问题
Feb 08 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
Sep 02 Javascript
EL表达式截取字符串的函数说明
Sep 22 Javascript
Vue多种方法实现表头和首列固定的示例代码
Feb 02 Javascript
基于html+css+js实现简易计算器代码实例
Feb 28 Javascript
如何构建一个Vue插件并生成npm包
Oct 26 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
关于Sphinx创建全文检索的索引介绍
2013/06/25 PHP
php使用GeoIP库实例
2014/06/27 PHP
php中base_convert()进制数字转换函数实例
2014/11/20 PHP
PHP程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
js tab 选项卡
2009/04/26 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
大学生校园创业计划书
2014/02/08 职场文书
护理专业自荐信范文
2014/02/26 职场文书
就业协议书
2014/09/12 职场文书
公司员工培训管理制度
2015/08/04 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书
解除合同协议书范本
2016/03/21 职场文书