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设置css属性的代码
Dec 28 Javascript
你必须知道的Javascript知识点之"字面量和对应类型"说明介绍
Apr 23 Javascript
跟我学习javascript的prototype使用注意事项
Nov 17 Javascript
简单总结JavaScript中的String字符串类型
May 26 Javascript
AnjularJS中$scope和$rootScope的区别小结
Sep 18 Javascript
微信小程序 网络请求(GET请求)详解
Nov 16 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
Sep 18 Javascript
JS实现图片居中悬浮效果
Dec 25 Javascript
redux-saga 初识和使用
Mar 10 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
Jun 01 Javascript
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 Vue.js
使用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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
用PHP获取Google AJAX Search API 数据的代码
2010/03/12 PHP
php设计模式 Visitor 访问者模式
2011/06/28 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
解析php中memcache的应用
2013/06/18 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
event对象的方法 兼容多浏览器
2009/06/27 Javascript
js日历功能对象
2012/01/12 Javascript
Jquery 实现grid绑定模板
2015/01/28 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
详解小程序BackgroundAudioManager踩坑之旅
2019/12/08 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
Python的时间模块datetime详解
2017/04/17 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
python使用代理ip访问网站的实例
2018/05/07 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
基于python实现简单C/S模式代码实例
2020/09/14 Python
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
params有什么用
2016/03/01 面试题
行政助理求职自荐信
2013/10/26 职场文书
电脑教师的自我评价
2013/12/18 职场文书
小孩百日宴答谢词
2014/01/15 职场文书
数学检讨书1000字
2014/02/24 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
话题作文之诚信
2019/11/28 职场文书
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis