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 dom代码应用 简单的相册[firefox only]
Jun 12 Javascript
js内置对象 学习笔记
Aug 01 Javascript
计算新浪Weibo消息长度(还可以输入119字)
Jul 02 Javascript
模拟jQuery中的ready方法及实现按需加载css,js实例代码
Sep 27 Javascript
js获取日期:昨天今天和明天、后天
Jun 11 Javascript
JavaScript获取某年某月的最后一天附截图
Jun 23 Javascript
JavaScript中的时间处理小结
Feb 24 Javascript
详解用原生JavaScript实现jQuery的某些简单功能
Dec 19 Javascript
ionic 3.0+ 项目搭建运行环境的教程
Aug 09 Javascript
bootstrap3-dialog-master模态框使用详解
Aug 22 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
Nov 22 Javascript
vue实现a标签点击高亮方法
Mar 17 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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
解析PHP可变函数的经典用法
2013/06/20 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
php使用session二维数组实例
2014/11/06 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
2017/02/14 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
原生js实现复制对象、扩展对象 类似jquery中的extend()方法
2014/08/30 Javascript
一个JavaScript获取元素当前高度的实例
2014/10/29 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
2017/05/17 Javascript
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
python处理文本文件并生成指定格式的文件
2014/07/31 Python
pytorch permute维度转换方法
2018/12/14 Python
关于python字符串方法分类详解
2019/08/20 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
tensorflow的计算图总结
2020/01/12 Python
python时间time模块处理大全
2020/10/25 Python
可爱的童装和鞋子:Fabkids
2019/08/16 全球购物
毕业生求职简历的自我评价
2013/10/07 职场文书
毕业生求职推荐信
2013/11/04 职场文书
英文求职信范文
2014/05/23 职场文书
2015学校年度工作总结
2015/05/11 职场文书
商务宴会祝酒词
2015/08/11 职场文书
Nginx下配置Https证书详细过程
2021/04/01 Servers