Node之EventEmitter

Node之EventEmitter

Node之EventEmitter 是 Node 中事件管理的通用机制。这就是为什么都使用 on 来触发流的事件,类似于 dom 里的注册事件。

js 复制代码
const { EventEmitter } = require("events")
//事件处理对象,可以注册事件和触发事件
const ee=new EventEmitter()
ee.on("abc",()=>{
    console.log("abc事件触发了1")
})
ee.addListener("abc",()=>{
    console.log("abc事件触发了2")
})
ee.on("abc",()=>{
    console.log("abc事件触发了3")
})
ee.emit("abc")//触发事件之后,会依次运行注册的abc事件函数

通过一个 EventEmitter 事件处理对象来进行注册和触发事件,类似于 vue ,通过 on 或者 addListener 来注册事件,通过 emit 来触发事件。之前的事件只是在内部进行了触发。emit 会依次运行事件函数,并且可以进行多次触发。

它就是一个事件队列,和生命周期不同,相当于一个对象,属性名是事件名,属性值是一个数组,包含了所有需要运行的事件函数。 once 表示运行一次,就是触发一次后将它从数组中除去,off 表示移除事件,将事件名和要移除的函数名传进去。

js 复制代码
ee.on("abc", (data1, data2) => {
    console.log("abc事件触发了1", data1, data2)
})
ee.emit("abc", 123, 456)

还可以传入参数,类似于 vue 里面的方式。

js 复制代码
const MyRequest = require('./MyRequest');
const req = new MyRequest('http://www.baidu.com');
req.send()
req.on("res",(headers,body)=>{
    console.log(headers,body)
})

const http = require('http');
const { EventEmitter } = require('events')
module.exports = class extends EventEmitter {
    constructor(url, options) {
        super();
        this.url = url
        this.options = options
    }
    // 发送请求
    send(body = "") {
        const request = http.request(this.url, this.options, res => {
            let result = ""
            res.on("data", chunk => {
                result += chunk.toString("utf-8")
            })
            res.on("end", () => {
                this.emit("res", res.headers, result)
            })
        })
        request.write(body)
        request.end()
    }
}

我们可以利用 EventEmitter 来创建一个发送网络请求模块。这个模块可以通过 send 发送请求,默认请求体为空,通过 res 事件得到响应头和响应体。

首先构造一个类继承自 EventEmitter 类,传入 url 和 options 。在 send 函数里处理 http 请求,使用流来接收结果,将接收的结果放到 res 事件中,在响应传输结束时进行手动触发。

相关推荐
夜郎king5 分钟前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
辰风沐阳13 分钟前
JavaScript 的宏任务和微任务
javascript
夏幻灵1 小时前
HTML5里最常用的十大标签
前端·html·html5
冰暮流星1 小时前
javascript之二重循环练习
开发语言·javascript·数据库
Mr Xu_1 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝1 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions2 小时前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_2 小时前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞052 小时前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl