node.js中的事件处理机制详解


Posted in Javascript onNovember 26, 2016

EventEmitter类

在Node.js的用于实现各种事件处理的event模块中,定义了一个EventEmitter类。所有可能触发事件的对象都是一个集成了EventEmitter类的子类的实例对象,在Node.js中,为EventEmitter类定义了许多方法,所有与对象的事件处理函数的绑定及解除相关的处理均依靠这些方法的调用来执行。

EventEmitter类的各种方法

event:代表事件名

listener:代表事件处理函数

中括号内的参数代表该参数为可选参数

方法名与参数 描述
addListener(event,listener)  对指定事件绑定事件处理函数
on(event, listener)  对指定事件绑定事件处理函数(addListener方法的别名)
once(event, listener)  对指定事件指定只执行一次的事件处理函数
removeListener(event, listener)  对指定事件接触事件处理函数
setMaxListeners(n)  指定事件处理函数的最大数量,n为正数值,代表最大的可指定事件处理函数的数量
listeners(event)  获取指定事件的所有事件处理函数
emit(event, [arg1], [arg2], [...])  手工触发指定事件

EventEmitter类的on方法

var http = require("http");
var server = http.createServer();
server.on("request", function(req, res){ 
 console.log(req.url); 
 res.end();
});
server.listen(1337, "127.0.0.1");

在这段代码中,我们指定当服务器接收到客户端请求时,在你控制台窗口中输出客户端请求的目标的URL地址,并使用响应对象的end方法立即结束响应。

执行代码,然后在浏览器窗口中输入:http://localhost:1337://,控制台输出如下:

node.js中的事件处理机制详解
控制台输出

当然,也可以通过多个on方法的执行来对同一个事件绑定多个事件处理函数。如下:

var http = require("http");
var server = http.createServer();

server.on('request', function(req, res){ 
 console.log('接收到客户端请求')
})

server.on("request", function(req, res){ 
 console.log('处理客户端请求') 
 console.log(req.url); 
 res.end();
})

server.on('request', function(req, res){
 console.log('发送响应完毕')
})

server.listen(1337, "127.0.0.1");

OK,执行代码,控制台输出如下:

node.js中的事件处理机制详解
控制台输出

另外,在默认情况下,针对同一个指定事件,最多可以绑定10个时间处理函数。可以通过setMaxListeners方法修改最多可以绑定的事件处理函数数量,方法如下:

emitter.setMaxListeners(n)

EventEmitter类的once方法

EventEmiiter类的once方法与on方法类似,作用均为对指定事件绑定事件处理函数,区别在于,当事件处理函数执行一次后立即被接触,即该事件处理函数只会被执行一次。once方法所用参数与on方法所用参数相同,如下:

emitter.once(event, listener)

做个试验。

还是执行如下代码(同上):

var http = require("http");
var server = http.createServer();

server.on('request', function(req, res){ 
 console.log('接收到客户端请求')
})

server.on("request", function(req, res){ 
 console.log('处理客户端请求') 
 console.log(req.url); 
 res.end();
})

server.on('request', function(req, res){
 console.log('发送响应完毕')
})

server.listen(1337, "127.0.0.1");

然后,在浏览器窗口中连续打开两次127.0.0.1:1337,控制台输出如下:

node.js中的事件处理机制详解
显示了两次

然后将on事件修改为once事件,代码如下:

var http = require("http");
var server = http.createServer();

server.once('request', function(req, res){ 
 console.log('接收到客户端请求')
})

server.on("request", function(req, res){ 
 console.log('处理客户端请求') 
 console.log(req.url); 
 res.end();
})

server.once('request', function(req, res){
 console.log('发送响应完毕')
})

server.listen(1337, "127.0.0.1");

控制台输出如下:

node.js中的事件处理机制详解
请求处理2次,其余只打印1次!

使用removeListener方法取消事件处理函数

代码如下:

var http = require("http");
var server = http.createServer();
var testFunction = function (req,res) {
 console.log('发送响应完毕')
}

server.on('request', function(req, res){
 console.log('接收到客户端请求')
})

server.on("request", function(req, res){
 console.log('处理客户端请求')
 console.log(req.url);
 res.end();
})

server.on('request', testFunction)
//删除
server.removeListener('request', testFunction)
server.listen(1337, "127.0.0.1");

运行代码,在浏览器窗口输入127.0.0.1:1337,控制台输出如下

node.js中的事件处理机制详解
控制台输出

emit方法:自定义事件并将其触发

代码如下:

var http = require("http");
var server = http.createServer();

server.on("request", function(req, res){
 console.log(req.url);
});

//自定义事件
server.on("customEvent", function(arg1, arg2, arg3){
 console.log("自定义事件被触发");
 console.log(arg1);
 console.log(arg2);
 console.log(arg3);
});

//触发自定义事件
server.emit('customEvent', '自定义参数1', '自定义参数2', '自定义参数3')
server.listen(1337, "127.0.0.1");

这次不在浏览器窗口中输入地址,直接运行代码查看控制台输出,控制台输出如下:

node.js中的事件处理机制详解
控制台输出

说明我们手动触发了自定义事件,也就是customEvent。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用node.js能有所帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jscript之List Excel Color Values
Jun 13 Javascript
AeroWindow 基于JQuery的弹出窗口插件
Jun 27 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
May 23 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
Mar 30 Javascript
Easyui Treegrid改变默认图标的方法
Apr 29 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
May 25 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
Aug 24 Javascript
Mongoose学习全面理解(推荐)
Jan 21 Javascript
js鼠标经过tab选项卡时实现切换延迟
Mar 24 Javascript
ES6新特性六:promise对象实例详解
Apr 21 Javascript
微信小程序公用参数与公用方法用法示例
Jan 09 Javascript
vue的webcamjs集成方式
Nov 16 Javascript
使用node.js中的Buffer类处理二进制数据的方法
Nov 26 #Javascript
火狐和ie下获取javascript 获取event的方法(推荐)
Nov 26 #Javascript
JS基于递归实现倒计时效果的方法
Nov 26 #Javascript
如何在Angular.JS中接收并下载PDF
Nov 26 #Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
Nov 25 #Javascript
AngularJs验证重复密码的方法(两种)
Nov 25 #Javascript
jQuery实现发送验证码并60秒倒计时功能
Nov 25 #Javascript
You might like
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
Koa日志中间件封装开发详解
2019/03/09 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
python实现换位加密算法的示例
2018/10/14 Python
Django框架模板介绍
2019/01/15 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Flask处理Web表单的实现方法
2021/01/31 Python
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
好邻里事迹材料
2014/01/16 职场文书
英文留学推荐信范文
2014/01/25 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
2015年班干部工作总结
2015/04/29 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
2016年教师学习廉政准则心得体会
2016/01/20 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
解析python中的jsonpath 提取器
2022/01/18 Python
MySQL优化之慢日志查询
2022/06/10 MySQL