nodejs的事件处理机制

类似于javascript客户端代码中存在由元素触发的事件机制,在nodejs中,也有由对象触发的事件处理机制,比如http.Server对象,就可能会触发'接收到客户端请求request'、'响应客户端请求response'、'连接错误'等各种事件。

nodejs中常用的内置模块主要有httpospathfseventsstream等,其中event模块就是用来实现各种事件处理机制的。

在学习event模块实现事件处理机制前,首先回顾下nodejs模块的引入。在nodejs中,可以直接使用require函数并将模块名设置为require函数的参数值的方法来引用模块。

可以用如下引用http模块的代码作为示例:

const http = require('http')

这段代码使用require函数来引用http模块,该函数返回http模块对象,可以通过将该对象赋值给http变量来访问http模块中的属性和方法。

好,回顾完毕。说回主线nodejs事件处理机制。

nodejs的用于实现各种事件处理的event模块中,定义了一个EventEmitter类,所有可能触发事件的对象都是一个继承了EventEmitter类的子类的实例对象EventEmitter类中定义好了许多方法,所有与对象的事件处理函数的绑定及解除相关的处理均依靠这些方法的调用来执行。

这里请注意两点,首先EventEmitter类是event模块里的类,其次EventEmitter类中定义的与对象调用相关的方法为实例方法。这与后面要讲到的类方法是有区别的。

EventEmitter类的实例方法:

  • addListener(event, listener) / on(event, listener) 对指定事件绑定事件处理函数
  • once(event, listener) 对指定事件只执行一次的事件处理函数
  • removeListener(event, listener)
  • removeAllListeners([event])
  • setMaxListeners(n) 指定事件处理函数的最大数量。n为整数值
  • listeners(event) 获取指定事件的所有事件处理函数
  • emit(event, [arg1], [arg2], […]) 手工触发指定事件

举一个示例以作代表:

const http = require('http');   //引入http模块并赋值给http变量
const server = http.createServer();     //创建http服务器并将该服务器赋值给变量server

//为server服务器在接收到客户端发来请求时q触发的request事件绑定事件处理函数
server.on('request', function(req, res){
    console.log(req.url);
    res.end();
});
server.listen(8000, '127.0.0.1')

EventEmitter类方法有两种:newListener事件与removeListener事件。

当对继承了EventEmitter类的子类的实例对象进行绑定事件处理函数时,都会触发EventEmitter类的newListener事件。

以下为示例代码:

emitter.on('newListener', function(e, f){
    //事件处理函数代码
    //参数e为被绑定的事件名
    //参数f为被绑定的事件处理函数
})

而当对继承了EventEmitter类的子类的实例对象进行取消事件处理函数时,都会触发EventEmitter类的removeListener事件。示例同上,只是参数e和f分别为被取消事件处理函数的事件名和事件处理函数,就不重复举例了。

原文发布于微信公众号 - 前端小二(frontendxiao2)

原文发表时间:2018-10-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券