当前位置: 首页 > article >正文

js 定义事件中心EventEmitter

在JavaScript中,EventEmitter 是一个常用于事件驱动编程的类,它允许对象(或称为“发射器”)发出命名事件,并让其他对象(或称为“监听器”)监听并响应这些事件。Node.js 的 events 模块提供了一个内置的 EventEmitter 类,但你也可以自己实现一个简单的版本。

下面是一个基本的 EventEmitter 实现示例:

class EventEmitter {
    constructor() {
        this.events = {};
    }

    // 注册事件监听器
    on(eventName, listener) {
        if (!this.events[eventName]) {
            this.events[eventName] = [];
        }
        this.events[eventName].push(listener);
    }

    // 一次性监听器,触发后立即移除
    once(eventName, listener) {
        const onceWrapper = (...args) => {
            this.off(eventName, onceWrapper);
            listener(...args);
        };
        this.on(eventName, onceWrapper);
    }

    // 移除事件监听器
    off(eventName, listener) {
        if (!this.events[eventName]) return;
        this.events[eventName] = this.events[eventName].filter(l => l !== listener);
    }

    // 触发事件
    emit(eventName, ...args) {
        if (!this.events[eventName]) return;
        this.events[eventName].forEach(listener => listener(...args));
    }

    // 获取事件监听器的数量
    listenerCount(eventName) {
        return this.events[eventName] ? this.events[eventName].length : 0;
    }
}

// 使用示例
const myEmitter = new EventEmitter();

myEmitter.on('event', () => {
    console.log('an event occurred!');
});

myEmitter.emit('event'); // 输出: an event occurred!

// 使用一次性监听器
myEmitter.once('event', () => {
    console.log('this will be logged only once');
});

myEmitter.emit('event'); // 输出: this will be logged only once
myEmitter.emit('event'); // 不会再次输出上面的日志

这个 EventEmitter 类实现了最基本的功能:注册监听器(on)、一次性监听器(once)、移除监听器(off)、触发事件(emit)以及获取监听器数量(listenerCount)。

请注意,这个实现是简化的,并没有处理一些边缘情况,比如在移除监听器时如果监听器没有被注册过,或者在触发事件时如果监听器抛出异常等。在实际应用中,你可能需要更健壮的实现,这时可以考虑使用 Node.js 内置的 events 模块中的 EventEmitter 类。


http://www.kler.cn/news/334782.html

相关文章:

  • 【数据分享】2000—2023年我国省市县三级逐月植被覆盖度(FVC)数值(Shp/Excel格式)
  • “衣依”服装销售平台:Spring Boot技术应用与优化
  • RabbitMQ入门2—详解virtual host
  • <<迷雾>> 第8章 学生时代的走马灯(2)--边缘触发 D 触发器 示例电路
  • 如何在微信小程序中实现分包加载和预下载
  • C++ STL常用查询手册
  • 【网络安全】绕过 Etplorer 管理面板实现RCE
  • ElasticSearch高级功能详解与读写性能调优
  • HTB:Preignition[WriteUP]
  • 查找与排序-插入排序
  • 新闻推荐系统:Spring Boot与大数据
  • 计算机网络——http和web
  • 2024年最新大模型LLM学习路径全解析!看完你就是LLM大师
  • 解决跨域问题
  • C++ | Leetcode C++题解之第455题分发饼干
  • 【算法】哈希映射(C/C++)
  • Kubernetes-使用不同主机终端访问k8s 集群。
  • windows上安装python环境
  • CSS元素堆叠
  • Redis:list类型