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

相关推荐
JeffongTan9 小时前
在LWC中镶嵌VF Page获取用户IP
前端·javascript·salesforce
wxwx_bscxy32210 小时前
NodeJS 高校学业预警系统10551
mysql·node.js·vue·高校学业预警
不cong明的亚子11 小时前
web live多屏互动平台
javascript·经验分享·音视频
陆枫Larry11 小时前
Astro 是什么
前端
是立不是利12 小时前
写给设计师的 CSS 博客美学指南
前端·css
dsyyyyy110113 小时前
JS复习,难点,易错点总结
开发语言·javascript·ecmascript
默_笙13 小时前
🏝 Docker 就是"房地产开发":从施工图纸到小区物业的容器化指南
前端·javascript
计算机魔术师13 小时前
Rohan Paul 谈用时间跨度衡量智能体能力,并引用 OpenAI 自动化研究实习生里程碑
前端
kyriewen13 小时前
我手写了个极简版 React Router——才搞懂 v6 为什么砍了这么多 API
前端·javascript·程序员
a11177613 小时前
Shirone 二次元博客主题 开源
前端·开源