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 事件中,在响应传输结束时进行手动触发。

相关推荐
不会敲代码14 小时前
手写 Mini React:从 JSX 到虚拟 DOM 再到 render,搞懂 React 底层原理
前端·javascript·react.js
kyriewen5 小时前
你的代码仓库变成“毛线团”了?Monorepo 用 Turborepo 拆成“乐高积木”
前端·javascript·面试
身如柳絮随风扬5 小时前
你知道什么是 Ajax 吗?—— 从入门到原理,一篇彻底搞懂
前端·ajax·okhttp
旷世奇才李先生5 小时前
Vue3\+TypeScript 2026实战——企业级前端项目架构搭建与性能优化全指南
前端·架构·typescript
Beginner x_u6 小时前
前端八股整理(工程化 02)|CommonJS/ESM、Webpack Loader/Plugin 与Vite 对比
前端·webpack·node.js·plugin·loader
openKaka_6 小时前
createRoot 到底创建了什么:FiberRootNode 和 HostRootFiber 的初始化过程
前端·javascript·react.js
苦夏木禾6 小时前
URL 类 详解
node.js·js
习明然7 小时前
UniApp开发体验感受总结
前端·uni-app
刀法如飞8 小时前
Claude Code Skills 推荐:2026年最值得安装的10个AI技能
前端·后端·ai编程
阿豪只会阿巴8 小时前
【没事学点啥】TurboBlog轻量级个人博客项目——项目介绍
javascript·python·django·html