分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

EventEmitter:nodeJs事件触发机制

发布时间:2023-09-06 02:25责任编辑:蔡小小关键词:暂无标签

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列

Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例

NodeJs事件监听触发机制依赖 events 核心模块,

events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装

我们来看看它的基本用法

const EventEmitter = require(‘events‘).EventEmitter//实例化EventEmitter类const event = new EventEmitter()//error是特殊事件,系统自动触发,如果程序没有设置监听器的话,系统遇到错误会抛出,终止代码运行event.on(‘error‘, err => { ???console.log(err)})//添加事件监听event.on(‘init‘, () => { ???console.log(`初始化...`)})//可以给一个事件设设置多个监听器event.on(‘data‘, reciveData)event.on(‘data‘, processData)//默认最多为一个事件设置10个监听器,可以通过以下方法修改// event.setMaxListeners(11)event.on(‘close‘, () => { ???console.log(`结束..`)})//移除监听器event.removeListener(‘data‘,reciveData)function reciveData(data){ ???console.log(`收到数据: ${data}`)}function processData(data){ ???console.log(`处理数据: ${data}`)}event.emit(‘init‘)setTimeout(()=>{ ???//触发事件,如果事件没被监听返回 false ???event.emit(‘data‘,‘ABCDEFG‘)},1000)setTimeout(()=>{ ???//触发事件 ???event.emit(‘close‘)},2000)

以上代码介绍了eventEmitter的全部用法,可能我们会问这个eventEmitter有什么卵用吗?

大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它

例如我们常用的方法 http.get 方法,该方法传入两个参数

参数1:需要请求url

参数2:http.IncomingMessage实例,而这个对象正是继承 eventEmitter 对象

下面代码大概模拟了了http.get工作原理

const EventEmitter = require(‘events‘).EventEmittervar myHttp = {}myHttp.incomingMessage = function(statusCode, headers){ ???this.statusCode = statusCode ???this.headers = headers}myHttp.incomingMessage.prototype = new EventEmitter()myHttp.get = function(url, fn){ ???//伪代码:获取url内容 ???var im = new this.incomingMessage(200,{‘content-type‘: ‘json/application‘}) ???fn(im) ???im.emit(‘data‘,`来自${url}的数据`)}module.exports = myHttp

使用

const myHttp = require(‘./event.js‘)myHttp.get(‘http://www.baidu.com‘, res => { ???console.log(res) ???res.on(‘data‘, data => { ???????console.log(data) ???})})

EventEmitter:nodeJs事件触发机制

原文地址:https://www.cnblogs.com/xiaoliwang/p/10092343.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved