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

相关推荐
IManiy3 分钟前
总结之Vibe Coding前端骨架
前端
小和尚敲木头7 分钟前
vue3 vite动态拼接图片路径
javascript
JS菌10 分钟前
AI Agent 沙箱双层防护体系:从权限过滤到内核隔离的完整实现
前端·人工智能·后端
Aphasia31120 分钟前
从输入URL到页面展示全流程
前端·面试
我叫黑大帅1 小时前
前端如何竖屏固定视口背景
前端·javascript·面试
abcy0712131 小时前
python pandas csv异步后台清洗前端优先返回成功信息
前端·python·pandas
不会敲代码11 小时前
我花了三天时间,终于把 Cookie、XSS、CSRF 和浏览器存储给整明白了
javascript·面试
IT_陈寒1 小时前
Vite这个坑我帮你踩了,动态导入居然这样才生效
前端·人工智能·后端
贩卖黄昏的熊1 小时前
flex 布局快速梳理
开发语言·javascript·css3·html5
swipe1 小时前
Mem0 x Agent 实战系列:分层记忆 + 三路召回,搭建真正可用的长期记忆层
前端·javascript·面试