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

相关推荐
狂炫冰美式6 分钟前
人均配了AI, 为什么公司还是没变快? 🤔 本质还是分布式系统问题
前端·后端·架构
铁皮饭盒1 小时前
Next.js 风格路由内置?Bun FileSystemRouter 凭啥这么香
javascript
乘风gg1 小时前
多 Agent 不是万能的!搞懂这 5 个原则,少走 1 年弯路!
前端·agent·ai编程
猩猩程序员2 小时前
Vercel 推出 Agent 框架 Eve:让 AI Agent 像写 Web 应用一样简单
前端
小林ixn2 小时前
别再背八股了!从 5 个真实场景彻底搞懂 JavaScript 的 this
javascript
爱读源码的大都督2 小时前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端
爱勇宝2 小时前
Claude Code 被曝暗藏“隐形检测”代码:封代理不是最可怕的,可怕的是你根本不知道它在干什么
前端·后端·程序员
小牛不牛的程序员2 小时前
我用 Claude Code 半天撸完了一个完整网站,AI 编程到底提升了多少效率?
前端
东风破_2 小时前
JavaScript 面试常考的字符串算法:从反转字符串到回文判断
前端·javascript
巴勒个啦2 小时前
D3.js 入门实战:用力导向图可视化项目依赖关系
javascript