node.js中的事件处理机制详解

 更新时间:2016年11月26日 09:43:03   作者:huber  
相信接触过编程的同学应该都了解,在访问任何网页的时候,会伴随着许多的事件,例如点击菜单,移动鼠标等等。那么node.js是如何处理的?下面通过这篇文章就来给大家详细的介绍下node.js中的事件处理机制,有需要的朋友们可以参考借鉴,下面来一起学习学习吧。

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://,控制台输出如下:


控制台输出

当然,也可以通过多个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,执行代码,控制台输出如下:


控制台输出

另外,在默认情况下,针对同一个指定事件,最多可以绑定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,控制台输出如下:


显示了两次

然后将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");

控制台输出如下:


请求处理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,控制台输出如下


控制台输出

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");

这次不在浏览器窗口中输入地址,直接运行代码查看控制台输出,控制台输出如下:


控制台输出

说明我们手动触发了自定义事件,也就是customEvent。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用node.js能有所帮助,如果有疑问大家可以留言交流。

相关文章

  • mac下安装node.js的详细步骤

    mac下安装node.js的详细步骤

    Node.js本质上是一个JavaScript运行时环境,它提供了在服务器端运行JavaScript代码的能力,这篇文章主要给大家介绍了关于mac下安装node.js的详细步骤,需要的朋友可以参考下
    2023-10-10
  • 详解基于Koa2开发微信二维码扫码支付相关流程

    详解基于Koa2开发微信二维码扫码支付相关流程

    这篇文章主要介绍了详解基于Koa2开发微信二维码扫码支付相关流程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • Node.js断点续传的实现

    Node.js断点续传的实现

    最近做了个项目,应项目需求,需要传图片、Excel等,几M的大小可以很快就上传到服务器,但是大的就需要断点上传,本文就介绍一下,感兴趣的可以了解一下
    2021-05-05
  • Node.js 学习笔记之简介、安装及配置

    Node.js 学习笔记之简介、安装及配置

    本文是Node.js学习笔记系列文章的第一篇,主要给大家讲解的是在Windows和Linux上安装Node.js的方法。软件安装版本以0.12.0为例。希望大家能够喜欢。
    2015-03-03
  • NodeJS配置CORS实现过程详解

    NodeJS配置CORS实现过程详解

    这篇文章主要介绍了NodeJS配置CORS实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • node.js快速部署vue代码详细步骤

    node.js快速部署vue代码详细步骤

    众所周知Vue是现在前端最流行的框架之一,作为前端开发人员应该要熟练的掌握它,下面这篇文章主要给大家介绍了关于node.js快速部署vue代码的详细步骤,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • node文件资源管理器的解压缩从零实现

    node文件资源管理器的解压缩从零实现

    这篇文章主要为大家介绍了node文件资源管理器的解压缩从零实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Node.js调用DeepSeek API的完整指南

    Node.js调用DeepSeek API的完整指南

    本文将介绍如何使用 Node.js 调用 DeepSeek API,实现流式对话并保存对话记录,Node.js 版本使用现代异步编程方式实现,支持流式处理和错误处理,文章通过代码示例讲解的非常详细,需要的朋友可以参考下
    2025-02-02
  • Windows下nodejs安装及环境配置的实战步骤

    Windows下nodejs安装及环境配置的实战步骤

    最近换了一个电脑,因为要使用到NodeJS,我将我自己的安装步骤分享给大家,下面这篇文章主要给大家介绍了关于Windows下nodejs安装及环境配置的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 在Express处理错误和未匹配路由的解决方法

    在Express处理错误和未匹配路由的解决方法

    在使用 Express 开发 Web 应用程序时,有效地处理错误和管理未匹配任何定义处理程序的路由至关重要,这确保了应用程序的健壮性和更好的用户体验,本文给出了详细的解决方法,需要的朋友可以参考下
    2024-01-01

最新评论