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 相关文章推荐
javascript 页面划词搜索JS
Sep 28 Javascript
了解jQuery技巧来提高你的代码
Jan 08 Javascript
超酷的网页音乐播放器DewPlayer使用方法
Dec 18 Javascript
JavaScript(js)设置默认输入焦点(focus)
Dec 28 Javascript
使用js Math.random()函数生成n到m间的随机数字
Oct 09 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
Mar 18 Javascript
js微信分享实现代码
Oct 11 Javascript
JavaScript原型链与继承操作实例总结
Aug 24 Javascript
JavaScript实现矩形块大小任意缩放
Aug 25 Javascript
vue移动端写的拖拽功能示例代码
Sep 09 Javascript
vue 使用lodash实现对象数组深拷贝操作
Sep 10 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
Oct 09 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开发中的页面跳转方法总结
2015/04/26 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
监听element-ui table滚动事件的方法
2019/03/26 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
Django添加sitemap的方法示例
2018/08/06 Python
Python实现注册、登录小程序功能
2018/09/21 Python
django主动抛出403异常的方法详解
2019/01/04 Python
Python csv模块使用方法代码实例
2019/08/29 Python
python随机模块random使用方法详解
2020/02/14 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
社会实践心得体会
2014/01/03 职场文书
甘南现象心得体会
2014/09/11 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
2015年大学社团工作总结
2015/04/09 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
学校远程教育工作总结
2015/08/11 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技