EventEmitter 源码分析与简易实现

Node之Event模块 写在前面事件的编程方式具有轻量级、松耦合、只关注事务点等优势,在浏览器端,有着自己的一套DOM事件机制,其中含包括这诸如事件冒泡,事件捕获等;然而Node的事件机制没有事件冒泡等,其原理就是设计模式中的观察者模式。Node很多的模块继承这个事件模块,下面我们就来根据源码来学习下其API,做到知其然更知其所以然。引入模块const EventEmitter = require("events"); c 阅读详情

在这里插入图片描述


阅读原文


EventEmitter 简介

EventEmitter 是 NodeJS 的核心模块 events 中的类,用于对 NodeJS 中的事件进行统一管理,用 events 特定的 API 对事件进行添加、触发和移除等等,核心方法的模式类似于发布订阅。


实现 EventEmitter

1、EventEmitter 构造函数的实现

// 文件:events.js
function EventEmitter() {
    this._events = Object.create(null);
}

/*
* 其他方法
*/

// 导出自定义模块
module.export = EventEmitter;

在构造函数 EventEmitter 上有一个属性 _events,类型为对象,用于存储和统一管理所有类型的事件,在创建构造函数的时候导出了 EventEmitter,后面实现其他方法的代码将放在构造函数与导出中间。

2、事件最大监听个数

在 EventEmitter 中监听的每一类事件都有最大监听个数,超过了这个数值,事件虽然可以正常执行,但是会发出警告信息,其目的是为了防止内存泄露。

// 默认事件最大监听个数
EventEmitter.defaultMaxListeners = 10;

这个同类型事件最大个数默认是 10,EventEmitter 当然也有方法设置和获取这个值,下面是设置和获取同类型事件最大监听个数的方法实现。

// 操作最大事件监听个数
// 设置同类型事件监听最大个数
EventEmitter.prototype.setMaxListeners = function (count) {
    this._count = count;
}

// 获取同类型事件监听最大个数
EventEmitter.prototype.getMaxListeners = function () {
    return this._count || EventEmitter.defaultMaxListeners;
}

在设置这个值的时候其实就是给 EventEmitter 实例添加了一个 _count 的属性用来存储设置的新值来作为这个类型事件的最大监听个数,在获取的时候就是获取 _count,如果没有设置过就获取默认值。

3、添加事件监听

在给 EventEmitter 的实例添加事件监听时,在 _event 对象中会以事件的类型作为属性名,值为一个数组,每次添加这个类型事件的时候,会将要执行的函数存入这个数组中进行统一管理。

添加事件监听的方法有 on、once、addListener、prependListener 和 prependOnceListener:

  • on 等同于 addListener 将函数正常添加到 _event 对应事件类型的数组中;
  • once 将函数添加到 _event 对应事件类型的数组中,但是只能执行一次;
  • prependListener 将函数添加到 _event 对应事件类型的数组中的前面;
  • prependOnceListener 将函数添加到 _event 对应事件类型的数组中的前面,但只能执行一次。

在 EventEmitter 中正常添加事件有四点需要注意:
1、如果其他的类使用 util 模块的 inherits 方法继承 EventEmitter 时是无法继承实例属性的,在调用操作 _events 的方法中因为无法获取到 _events 导致报错,为了兼容这种继承的情况,在获取不到 _events 时应添加一个 _events 到继承 EventEmitter 的类的实例上;
2、如果添加事件的类型为 newListener,传入要执行的函数会有一个参数 type ,是事件的类型,之后再添加事件的时候,就会执行 newListener 的函数,对添加的事件的事件类型进行处理;
3、on 方法表面上有两个参数,实际上有第三个参数,为布尔值,代表是否从 _events 对应事件类型的数组前面追加函数成员;
4、在添加事件的时候需要判断是否超出这个类型事件的最大监听个数,如果超出要打印警告信息。

on 方法和 addListener 方法的实现:

// on 和 addListener 方法
// 添加事件监听
EventEmitter.prototype.on = EventEmitter.prototype.addListener = function (type, callback, flag) {
    // 兼容继承不存在 _events 的情况
    if (!this._events) this._events = Object.create(null);

    // 如果 type 不是 newListener 就去执行 newListener 的回调
    if (type !== "newListener") {
        // 如果没添加过 newListener 事件就忽略此处的逻辑
        if (this._events["newListener"] && this._events["newListener"].length) {
            this._events["newListener"].forEach(fn => fn(type));
        }
    }

    // 如果不是第一次添加 callback 存入数组中
    if (this._events[type]) {
        // 是否从数组前面添加 callback
        if (flag) {
            this._events[type].unshift(callback);
        } else {
            this._events[type].push(callback);
        }
    } else {
        // 第一次添加,在 _events 中创建数组并添加 callback 到数组中
        this._events[type] = [callback];
    }

    // 获取事件最大监听个数
    let maxListeners = this.getMaxListeners();

    // 判断 type 类型的事件是否超出最大监听个数,超出打印警告信息
    if (this._events[type].length - 1 === maxListeners) {
        console.error(`MaxListenersExceededWarning: ${maxListeners + 1} ${type} listeners added`);
    }
}

通过上面代码可以看出 on 方法的第三个参数其实是服务于 prependListener 方法的,其他添加事件的方法都是基于 on 来实现的,只是在调用 on 的外层做了不同的处理,而我们平时调这些添加事件监听的方法时都只传入 type 和 callback。

prependListener 方法的实现:

// prependListener 方法
// 添加事件监听,从数组的前面追加
EventEmitter.prototype.prependListener = function (type, callback) {
    // 第三个参数为 true 表示从 _events 对应事件类型的数组前面添加 callback
    this.on(type, callback, true);
}

once 方法的实现:

// once 方法
// 添加事件监听,只能执行一次
EventEmitter.prototype.once = function (type, callback, flag) {
    let wrap => (...args) {
        callback(...args);

        // 执行 callback 后立即从数组中移除 callback
        this.removeListener(type, wrap);
    }

    // 存储 callback,确保单独使用 removeListener 删除传入的 callback 时可以被删除掉
    wrap.realCallback = callback;

    // 调用 on 添加事件监听
    this.on(type, wrap, flag);
}

想让事件只执行一次,需要在执行 callback 之后就立即在数组中移除这个函数,由于是同步执行,直接操作 callback 是很难实现的,添加事件其实就是添加 callback 到 _events 对应类型的数组中,我们在使用 once 的时候将 callback 包一层函数名为 wrap,将这个外层函数存入数组,wrap 的内部逻辑就是真正 callback 的调用和移除 wrap,这里涉及到事件监听的移除方法 removeListener 在后面来详细说明。

once 的第三个参数是为了 prependOnceListener 服务的,prependOnceListener 与 prependListener 实现方式类似,不同的是 prependOnceListener 是基于 once 实现的。

prependOnceListener 方法的实现:

// prependOnceListener 方法
// 添加事件监听,从数组的前面追加,只执行一次
EventEmitter.prototype.prependOnceListener = function (type, callback) {
    // 第三个参数为 true 表示从 _events 对应事件类型的数组前面添加 callback
    this.once(type, callback, true);
}

4、移除事件监听

移除事件监听有两个方法,分别是 removeListener 和 removeAllListeners,前者的作用是移除某个类型数组中的某个回调函数,后者的作用是移除某个类型数组的所有成员,如果类型参数为空,则清空整个 _events。

removeListener 方法的实现:

// removeListener 方法
// 移除事件执行程序
EventEmitter.prototype.removeListener = function (type, callback) {
    if(this._events[type]) {
        // 过滤掉当前传入的要移除的 callback
        this._events[type] = this._events[type].filter(fn => {
            return fn !== callback && fn !== callback.realCallback;
        });
    }
}

由于 once 中在真正的 callback 包了一层 wrap, 只有在触发事件时才能执行 wrap 并执行 removeListener 删掉函数,如果在事件触发之前使用 removeListener 删除,传入的是真正的回调 callback,无法删除,所以在 once 方法中对真正的 callback 进行了存储,在 removeListener 中调用 filter 时的返回条件的逻辑中做了处理。

removeAllListeners 方法的实现:

// removeAllListeners 方法
// 移除全部事件执行程序
EventEmitter.prototype.removeAllListeners = function (type) {
    // 存在 type 清空 _events 对应的数组,否则直接清空 _events
    if (type) {
        this._events[type] = [];
    } else {
        this._events = Object.create(null);
    }
}

5、触发事件监听

执行事件就比较简单了,取出 _events 中对应类型的数组进行循环,执行内部的每一个函数,第一个参数为 type,后面参数会作为数组中函数执行传入的参数。

// emit 方法
// 触发事件
EventEmitter.prototype.emit = function (type, ...args) {
    if (this._events[type]) {
        // 循环执行函数,并将 this 指回 EventEmitter 实例
        this._events[type].forEach(fn => fn.call(this, ...args));
    }
}

6、获取事件类型名称集合

// eventNames 方法
// 获取监听的所有事件类型
EventEmitter.prototype.eventNames = function () {
    return Object.keys(this._events);
}

7、按事件类型获取执行程序的集合

// listeners 方法
// 获取事件类型对应的数组
EventEmitter.prototype.listeners = function (type) {
    return this._events[type];
}

EventEmitter 的基本使用

EventEmitter 的核心逻辑已经实现,由于上面大多数方法需要组合使用,所以在没有一一验证,下面让我们通过一些案例来了解 EventEmitter 的用法。

我们在这里引入自己自定义的 events 模块,并使用 util 模块的 inherits 继承 EventEmitter,下面是前置代码,后面将不在重复。

// 文件:events-demo.js
// 引入依赖
const EventEmitter = require("./events");
const util = require("util");

function Girl() {}

// 使 Girl 继承 EventEmitter
util.inherits(Girl, EventEmitter);

// 创建 Girl 的实例
let girl = new Girl();

案例 1:设置和获取同类型事件的最大监听个数

// 文件:events-demo.js
// 获取事件最大监听个数
console.log(girl.getMaxListeners()); // 10

// 设置事件最大监听个数
girl.setMaxListeners(2);
console.log(girl.getMaxListeners()); // 2

案例 2:使用 on 添加事件并执行

// 文件:events-demo.js
girl.on("失恋", () => console.log("哭了"));
girl.on("失恋", () => console.log("喝酒"));

girl.emit("失恋");

// 哭了
// 喝酒

案例 3:使用 prependListener 添加事件并执行

// 文件:events-demo.js
girl.on("失恋", () => console.log("哭了"));
girl.prependListener("失恋", () => console.log("喝酒"));

girl.emit("失恋");

// 喝酒
// 哭了

案例 4:添加 newListener 类型的事件

// 文件:events-demo.js
girl.on("newListener", (type) => console.log(type));

girl.on("失恋", () => console.log("哭了"));
girl.on("和好", () => console.log("开心"));

// 失恋
// 和好

案例 5:添加同类型事件超出最大个数并执行事件

// 文件:events-demo.js
// 设置事件最大监听个数
girl.setMaxListeners(2);

girl.on("失恋", () => console.log("哭了"));
girl.on("失恋", () => console.log("喝酒"));
girl.on("失恋", () => console.log("吸烟"));

girl.emit("失恋");

// MaxListenersExceededWarning: 3 失恋 listeners added
// 哭了
// 喝酒
// 吸烟

案例 6:对比 on 和 once

// 文件:events-demo.js
girl.on("失恋", () => console.log("哭了"));
girl.once("失恋", () => console.log("喝酒"));

girl.emit("失恋");
girl.emit("失恋");

// 哭了
// 喝酒
// 哭了

案例 7:移除 on 和 once 添加的事件监听

// 文件:events-demo.js
let cry = () => console.log("哭了");
let drink = () => console.log("喝酒");

girl.on("失恋", cry);
girl.once("失恋", drink);
girl.on("失恋", () => console.log("吸烟"));

girl.removeListener("失恋", cry);
girl.removeListener("失恋", drink);

// 吸烟

案例 8:使用 prependOnceListener 添加事件监听

// 文件:events-demo.js
girl.on("失恋", () => console.log("哭了"));
girl.prependOnceListener("失恋", () => console.log("喝酒"));

girl.emit("失恋");
girl.emit("失恋");

// 喝酒
// 哭了
// 哭了

案例 9:获取某个事件类型执行程序的集合

// 文件:events-demo.js
let cry = () => console.log("哭了");
let drink = () => console.log("喝酒");

girl.on("失恋", cry);
girl.once("失恋", drink);
girl.once("失恋", () => console.log("吸烟"));

console.log(girl.listeners("失恋"));

// [ [Function: cry], [Function: drink], [Function] ]

案例 10:获取所有事件类型名称

// 文件:events-demo.js
girl.on("失恋", () => console.log("哭了"));
girl.on("和好", () => console.log("开心"));

console.log(girl.eventNames());

// [ '失恋', '和好' ]

案例 11:使用 removeAllListeners 按类型移除事件监听

// 文件:events-demo.js
girl.on("失恋", () => console.log("哭了"));
girl.on("失恋", () => console.log("喝酒"));
girl.on("和好", () => console.log("开心"));

// 移除 “失恋” 类型事件监听
girl.removeAllListeners("失恋");

console.log(girl.listeners("失恋"));

// []

案例 12:使用 removeAllListeners 移除全部事件监听

// 文件:events-demo.js
girl.on("失恋", () => console.log("哭了"));
girl.on("失恋", () => console.log("喝酒"));
girl.on("和好", () => console.log("开心"));

// 移除全部事件监听
girl.removeAllListeners();

console.log(girl._events);

// {}

EventEmitter 总结

events 模块在 NodeJS 中的使用率非常高,很多其他模块的事件执行机制都是通过继承该模块的 EventEmitter 类来实现的,比如 ReadStream(可读流)、WriteStream(可写流)、net(tcp)和 http 等等,我们也可以通过上面案例的方式创建自己的类去继承 EventEmitter 来实现事件的管理。


nodejs篇 内置模块events 常用api nodejs篇 继续,events内置模块的使用介绍,现在某些框架的事件触发,设计模式都与之相似,比如vue 阅读详情

相关推荐

前端开源库-event-emitter-mixin

前端开源库-event-emitter-mixin事件发射器混合,使用ES7装饰器的事件发射器混合

NodeJS中的事件(EventEmitter) API详解(附源码)

EventEmitter 简介EventEmitter 是 NodeJS 的核心模块 events 中的类,用于对 NodeJS 中的事件进行统一管理,用 events 特定的 API 对事件进行添加、触发和移除等等,核心方法的模式类似于发布订阅。实现 EventEmitter1、EventEmitter 构造函数的实现文件:events.jsfunction EventEmitter() { ...

weixin_33953384的博客 571

node.js中的events.emitter.removeAllListeners方法使用说明

方法说明: 移除所有监听器,如果指定event,则将移除指定事件的所有监听器。 语法: 代码如下: emitter.removeAllListeners([event]) 接收参数: event         事件类型,支持多个 例子: 代码如下: //移除所有监听器   emitter.removeAllListeners()   //移除指定event的所有监听器   emitter.removeAllListeners(‘data’) 源码: 代码如下: EventEmitter.prototype.removeAllListeners = function(type) {

Node 中的Event模块详解

Events是node.js最重要的模块,它提供了一个对象events.EventEmitter,EventEmitter 的核心是事件发射与事件监听器。 Node.js中大部分的模块,都继承自Event模块。 EventEmitter 支持若干个事件监听器,当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。 事件模块相关的方法主要有以下这些: 1. Ev......

分享前端工程化、AI 应用、Agent 开发与大模型实践! 2471

现代 AI Agent 编排技术全景(1)—— 分类体系与四大技术维度

本文介绍基于 LLM 的现代 Agent 分类体系与四大技术维度,形成能够刻画不同 Agent 产品架构特征的分类法

佚失的诗篇 236

ESP32 开发实战:VS Code 头文件波浪线及编译错误的终极解决方案

本文针对ESP32开发者在VS Code中常见的头文件红色波浪线和fatal error编译错误,提供了终极解决方案。通过详细讲解如何配置c_cpp_properties.json文件来修复编辑器智能提示,以及如何修改CMakeLists.txt来修正编译器路径,帮助开发者彻底解决环境配置问题,提升开发效率。

prometheus9mon的博客 294

Electron 基础教程-6.4 IPC监听器

我们可能想要移除掉某个IPC监听器,IPC模块为异步和同步进程提供了相似的语法。如果想要移除主进程中的单个监听器,语法为:ipcMain.removeListener(channel name, function)类似地,在移除渲染进程的单个监听器:ipcRenderer.removeListener(channel name, function)其中

Housz的博客 3639

STM32H743 SD卡读写避坑实录:CubeMX配置MDMA给FATFS,我的FreeRTOS项目踩了哪些雷?

本文详细解析了STM32H743在CubeMX配置中结合SDMMC、MDMA与FATFS的实战避坑指南,特别针对FreeRTOS环境下的SD卡读写问题提供了解决方案。从时钟配置到FATFS参数设置,再到DMA缓存维护和FreeRTOS集成技巧,帮助开发者高效解决数据损坏、DMA传输错误等常见问题,提升项目稳定性。

weixin_30878501的博客 494

vite打包后出现 buffer is undefined问题修复

【代码】vite打包后出现 buffer is undefined问题修复。

qq_34486756的博客 1740

嵌入式开发:用状态机实现STM32按键消抖,告别阻塞延时

在嵌入式系统开发中,处理异步事件和实时响应是核心挑战。状态机作为一种强大的编程模型,通过定义有限的状态、事件和状态转换规则,将复杂的、非线性的控制逻辑转化为清晰、确定且易于维护的代码结构。其技术价值在于实现逻辑的模块化、异步化和非阻塞化,能显著提升代码的可读性、可扩展性和系统实时性。这一思想广泛应用于协议解析、用户界面交互、传感器数据处理等场景。本文以嵌入式开发中基础的按键处理为例,针对传统“延时消抖”方法会阻塞主循环、影响实时性的痛点,深入讲解如何运用状态机思维重构按键消抖逻辑。通过分析状态机的核心三要素

weixin_33377602的博客 339

运算放大器电路中的T型网络:如何用更小电阻实现高增益并降低噪声?

本文深入解析了运算放大器电路中T型反馈网络的设计与应用。该网络通过三个较小阻值电阻的组合,等效实现高增益,有效规避了传统大反馈电阻带来的显著热噪声问题。文章从数学原理、噪声定量分析到实际设计技巧,系统阐述了如何利用T型网络在实现高增益的同时,显著降低电路噪声并改善整体性能。

banana的博客 318

EventEmitter3源码分析与学习

背景 事件监听在前端的开发过程中是一个很常见的情况。DOM上的事件监听方式,让我们看到了通过事件的方式来进行具体的业务逻辑的处理的便捷。 在具体的一些业务场景中,第三方的自定义事件能够在层级较多,函数调用困难以及需要多个地方响应的时候有着其独特的优势——调用方便,避免多层嵌套,降低组件间耦合性。 这篇文章所提到的EventEmitter3,就是一个典型的第三方事件库,能够让我们通过自定义的实践来实现多个函数与组件间的通信。 整体结构图 EventEmitter3的设计较为的简单,具体结构可以看下图

weixin_42899690的博客 929

★教程3:Simulink学习教程入门60例目录

1.订阅本教程用户可以免费获得本博任意1个(包括所有免费专栏和付费专栏)博文对应代码;2.本Simulink课程的所有案例(部分理论知识点除外)均由博主编写而成,供有兴趣的朋友们自己订阅学习使用。未经本人允许,禁止任何形式的商业用途;3.本课程除了介绍常见的Simulink模块介绍之外,我们更侧重于各种实例的完整设计介绍。从通信,控制器,图像处理,语音处理,电力系统等诸多常用领域介绍了相关案例,如果对于某个较为复杂的案例,初学者无法正确复现,也可以私信博主获得完整Simulink模型文件。

FPGA/MATLAB学习教程/源码/项目合作开发 1万+

EventEmitter 模块源码分析

  简介 EventEmitter 模块是node中经常用到模块,主要是为了实现监听事件。像在koa、express中就经常看到这样的监听事件。 app.on('3000', () => { console.log('the server is running') }) 因为大多数 Node.js 核心 API 都采用惯用的异步事件驱动架构,所以需要监听某个阶段来告知当前的...

Mayness的博客 1202

28、数字电路测试与半导体内存测试全解析

本文全面解析了数字电路中的顺序电路测试生成方法与半导体内存测试技术。内容涵盖顺序电路中的故障检测、多重观察测试、可驱动性分析、伪组合电路测试及初始化问题,并深入探讨了内存技术发展、故障模型、测试流程与未来趋势。重点介绍了DRAM、SRAM等主流内存类型的特点,以及制造和使用过程中面临的永久性与非永久性故障挑战,提出了基于故障模型的高效测试策略与优化方案。

go5gopher的博客 122

【数据集8】全球人口数据WorldPop详解

全球人口数据WorldPop详解

WW、forever的博客 7880

node EventEmitter源码分析与实现

events.js#EventEmitter.init() 纯对象 event.js#EventEmitter.prototype.emit() 图解 传送门:简单实现EventEmitter

qq_45593068的博客 385

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深入理解 Node.js 中 EventEmitter源码分析(3.0.0版本)

events模块对外提供了一个 EventEmitter 对象,即:events.EventEmitter. EventEmitter 是NodeJS的核心模块events中的类,用于对NodeJS中的事件进行统一管理,使用events可以对特定的API事件进行添加,触发和移除等。我们可以通过 require('events')来访问该模块。 比如如下代码: // 引入 events 模块...

weixin_30216561的博客 390

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

eventEmitter3源码分析与学习

背景 事件监听在前端的开发过程中是一个很常见的情况。DOM上的事件监听方式,让我们看到了通过事件的方式来进行具体的业务逻辑的处理的便捷。 在具体的一些业务场景中,第三方的自定义事件能够在层级较多,函数调用困难以及需要多个地方响应的时候有着其独特的优势——调用方便,避免多层嵌套,降低组件间耦合性。 这篇文章所提到的EventEmitter3...

weixin_33757609的博客 349

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Rect Native bridging 源码分析--EventEmitter.h

摘要:该文件实现了React Native跨平台框架中的异步事件通信核心机制,包含三个主要组件:1) EventSubscription封装事件订阅移除逻辑;2) IAsyncEventEmitter抽象接口及其模板实现AsyncEventEmitter,支持事件监听注册和触发;3) 对应的Bridging模板特化实现C++与JS层(JSI)的跨语言映射。系统通过线程安全的共享状态管理(使用std::mutex)、移动语义优化和编译期参数约束,提供了高效可靠的事件订阅、触发和管理能力,支持最多1个参数的事件

dengfuma的专栏 1750

Node 学习六、核心模块 events之 01 events 和 EventEmitter 类、发布订阅、EventEmitter 类源码解析和模拟实现

events 事件模块 events 与 EventEmitter node.js 是基于事件驱动的异步操作架构,内置 events 模块 events 模块提供了 EventEmitter 类 这个类的实例对象具备注册事件、发布事件和删除事件的一系列事件模型机制的常规操作 node.js 中很多内置核心模块继承 EventEmitter 类 所以开发者在使用的时候无需单独的引入 events 模块。 EventEmitter 常见 API on:注册事件监听器 emit:触发事件,按照注

皮蛋很白的博客 2696

从发布订阅模式入手读懂Node.js的EventEmitter源码

前面一篇文章setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop详细讲解了浏览器和Node.js的异步API及其底层原理Event Loop。本文会讲一下不用原生API怎么达到异步的效果,也就是发布订阅模式。发布订阅模式在面试中也是高频考点,本文会自己实现一个发布订阅模式,弄懂了他的原理后,我们就可以去读Node.js的EventEmitter源码,这也...

dennis_jiang的博客 397

Js Event

关于 event 菜狗子在这做点简单的整理下而已。 有错误欢迎指出斧正 node EventEmitter 在node中我们要实现一套事件机制真的是无比简单的。直接继承下原生的EventEmitter完成~。菜狗子比较闲,就和大家一起读读这部分的源码。 源码地址 /** 发布一个事件,这部分比较简单 */ EventEmitter.prototype.emit = function emit(...

weixin_33922672的博客 122

[源码解读]一文彻底搞懂Events模块

前言为什么写这篇文章?清楚的记得刚找node工作和面试官聊到了事件循环,然后面试官问事件是如何产生的?什么情况下产生事件。。。Events 在哪些场景应用到了?之前封装了...

全栈者 的博客 1042

终极指南:如何利用vscode-leetcode事件总线实现高效组件通信

想要在VS Code中高效刷LeetCode算法题吗?vscode-leetcode插件通过其强大的事件总线系统EventEmitter,实现了各组件间的无缝通信,让算法练习变得轻松愉快。本文将为你揭秘事件总线的实现原理和使用技巧,帮助你更好地理解这个优秀的开源项目。 ## 🚀 什么是vscode-leetcode事件总线? vscode-leetcode插件采用**EventEmitter

gitblog_00523的博客 850
上一篇: CommonJS 模块化简易实现
下一篇: NodeJS —— Buffer 解读
Panda Shen
博客等级 码龄10年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值