1. node 事件管理的通用机制
  2. 内部维护多个事件队列

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);
});
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. EventEmitter 常用 API
  2. 2. 基本使用
  3. 3. 案例:封装 http 请求