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的类型转换
Oct 12 Javascript
JavaScript中的await/async的作用和用法
Oct 31 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
Dec 08 Javascript
js学习总结_选项卡封装(实例讲解)
Jul 13 Javascript
jQuery DOM节点的遍历方法小结
Aug 15 jQuery
解决VUE框架 导致绑定事件的阻止冒泡失效问题
Feb 24 Javascript
从零开始学习搭建React脚手架项目
Aug 23 Javascript
spring+angular实现导出excel的实现代码
Feb 27 Javascript
vue登录页面cookie的使用及页面跳转代码
Jul 10 Javascript
node删除、复制文件或文件夹示例代码
Aug 13 Javascript
jstree中的checkbox默认选中和隐藏示例代码
Dec 29 Javascript
three.js 将图片马赛克化的示例代码
Jul 31 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
完美解决PHP中文乱码
2009/11/26 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
PHP扩展开发教程(总结)
2015/11/04 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
jQuery列表拖动排列具体实现
2013/11/04 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
JavaScript中for循环的使用详解
2015/06/03 Javascript
深入浅析knockout源码分析之订阅
2016/07/12 Javascript
Nodejs抓取html页面内容(推荐)
2016/08/11 NodeJs
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
2020/04/03 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
Python 加密与解密小结
2018/12/06 Python
详解安装mitmproxy以及遇到的坑和简单用法
2019/01/21 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
Python基于xlrd模块处理合并单元格
2020/07/28 Python
Python之Sklearn使用入门教程
2021/02/19 Python
英国女性运动服品牌:Sweaty Betty
2018/11/08 全球购物
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
精彩广告词大全
2014/03/19 职场文书
商超业务员岗位职责
2015/02/13 职场文书
前台岗位职责范本
2015/04/16 职场文书
产品调价通知函
2015/04/20 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
高中团支书竞选稿
2015/11/21 职场文书
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫