- node 事件管理的通用机制
- 内部维护多个事件队列
EventEmitter 常用 API
API | 描述 |
---|---|
on | 注册事件监听器 |
emit | 触发事件,按照注册的顺序同步调用每个事件监听器 |
once | 注册事件监听器,但只在第一次事件发布的时候执行,之后就被删除 |
off | 移除特定的监听器 |
基本使用
const { EventEmitter } = require("events");
const ee = new EventEmitter(); // 创建一个事件处理对象,可以注册事件,可以触发事件
const fn2 = () => console.log("abc事件触发了2");
ee.on("abc", () => {
console.log("abc事件触发了1");
});
ee.on("abc", fn2);
ee.once("abc", () => {
console.log("abc事件触发了3", "该事件只触发一次");
});
ee.on("bcd", () => {
console.log("bcd事件触发了3");
});
ee.emit("abc"); // 触发名为 abc 的事件,会依次运行注册的事件函数
ee.off("abc", fn2); // 取消事件
ee.emit("abc"); // 触发名为 abc 的事件,会依次运行注册的事件函数
ee.emit("abc"); // 触发名为 abc 的事件,会依次运行注册的事件函数
ee.emit("bcd"); // 触发名为 bcd 的事件,会依次运行注册的事件函数
console.log("script end");
案例:封装 http 请求
JS
JS
// 发送网络请求模块
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();
}
};
const MyRequest = require("./MyRequest");
const request = new MyRequest("http://duyi.ke.qq.com");
request.send();
request.on("res", (headers, body) => {
console.log(headers);
console.log(body);
});
打赏作者
您的打赏是我前进的动力
微信
支付宝
node👉 node 生命周期
上一篇
评论