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