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 相关文章推荐
qTip2 精致的基于jQuery提示信息插件
Feb 17 Javascript
javascript下拉框选项单击事件的例子分享
Mar 04 Javascript
原生JavaScript实现异步多文件上传
Dec 02 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
js实现日历与定时器
Feb 22 Javascript
Vue中定义全局变量与常量的各种方式详解
Aug 23 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
Aug 25 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
Feb 05 Javascript
vue中动态添加class类名的方法
Sep 05 Javascript
vue使用swiper实现中间大两边小的轮播图效果
Nov 24 Javascript
js根据后缀判断文件文件类型的代码
May 09 Javascript
基于ajax及jQuery实现局部刷新过程解析
Sep 12 jQuery
使用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中使用灵巧的体系结构
2006/10/09 PHP
PHP 定界符 使用技巧
2009/06/14 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
利用Laravel事件系统如何实现登录日志的记录详解
2017/05/20 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
每天一篇javascript学习小结(Array数组)
2015/11/11 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
用element的upload组件实现多图片上传和压缩的示例代码
2019/02/12 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
js实现简单扫雷
2020/11/27 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
python中通过预先编译正则表达式提高效率
2017/09/25 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
python编写俄罗斯方块
2020/03/13 Python
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
党员评议个人总结
2014/10/20 职场文书
死者家属慰问信
2015/03/24 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript