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下查找父节点的简单方法
Aug 13 Javascript
javascript 定义新对象方法
Feb 20 Javascript
jQuery.ajax 用户登录验证代码
Oct 29 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
May 12 Javascript
javascript遇到html5的一些表单属性
Jul 05 Javascript
jqGrid用法汇总(全经典)
Jun 28 Javascript
Node.js创建Web、TCP服务器
Dec 05 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
Mar 17 Javascript
javascript异步处理与Jquery deferred对象用法总结
Jun 04 jQuery
vue远程加载sfc组件思路详解
Dec 25 Javascript
查找Vue中下标的操作(some和findindex)
Aug 12 Javascript
JS实现无限轮播无倒退效果
Sep 21 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
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
一个完整的php文件上传类实例讲解
2015/10/27 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
PHP explode()函数用法讲解
2019/02/15 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
jQuery代码优化 选择符篇
2011/11/01 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
AngularJS ng-bind-template 指令详解
2016/07/30 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
小程序自定义日历效果
2018/12/29 Javascript
npm的lock机制解析
2019/06/20 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
Python函数中定义参数的四种方式
2014/11/30 Python
在Python中使用AOP实现Redis缓存示例
2017/07/11 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
使用Python的turtle模块画国旗
2019/09/24 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
你懂得怎么写自荐信吗?
2013/12/27 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
户籍证明格式
2014/09/15 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
写给领导的感谢信
2015/01/22 职场文书
Python+Appium新手教程
2021/04/17 Python