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

eventEmitter实现

没有做任何异常处理,简单模拟实现

  • 事件对象的每一个事件都对应一个数组

/*
    __events = {
        "事件1":[cb1,cb2],
        "事件2":[cb3,cb4],
        "事件3":[...],
        "事件4":[...],
    };
    
*/

class E{
    __events = {};

    constructor(){}

    //注册监听回调
    on(type , callback){
    	//已经有对应事件回调则加入数组
        if(this.__events[type]){
            this.__events[type].push(callback);
            return true;
        }
        else{
        //没有则放入新数组
            this.__events[type] = [callback];
            return false;
        }
    }

    // 触发事件
    emit(type, ...args){
        if(this.__events[type] && this.__events[type].length){
            this.__events[type].forEach(cb => {
                cb.call(this,args);
            });
        }
    }

    //取消事件对应回调
    off(type, callback){
        if(this.__events[type] && this.__events[type].length){
            this.__events[type] = this.__events[type].filter((cb)=>{
                return cb !== callback && cb.ref !== callback;
            })
            return true;
        }
        return false;
    }

    //注册一次
    once(type, callback){
        let once_func = function(...args){
            callback.call(this,...args);
            this.off(type,once_func);
        }
        //用于取消 off()
        once_func.ref = callback;
        this.on(type,once_func);
    }
}

let obj = new E();

function cb (data) { console.log(data);}
obj.on("f1",cb);
obj.off("f1",cb);
obj.emit("f1", 1,2,3,4,5);

http://www.dtcms.com/a/111184.html

相关文章:

  • 网络建设与运维神州数码DCN MAC地址表操作
  • TypedDict和dataclass的优缺点对比
  • 前馈控制与反馈控制融合算法详解及python案例分析
  • JavaWeb学习--MyBatis-Plus整合SpringBoot的ServiceImpl方法(增加,修改与删除部分)
  • 深入解析:使用Python爬取Bilibili视频
  • 如何用DeepSeek进行SWOT分析?以CSDN的“C知道”为例
  • k8s的StorageClass存储类和pv、pvc、provisioner、物理存储的链路
  • 做一个Andriod系统应用的方法
  • 软件设计师之设计模式
  • 第七章 Python基础进阶-异常、模块与包(其五)
  • 手撕AVL树
  • 模运算核心性质与算法应用:从数学原理到编程实践
  • Julia语言的测试覆盖率
  • 卷积神经网络CNN 经典模型 — GoogleLeNet、ResNet、DenseNet算法原理与模型构造
  • Visual Basic语言的网络协议栈
  • AIGC时代Kubernetes企业级云原生运维实战:智能重构与深度实践指南
  • SpringAI整合Ollama集成DeepSeek
  • 搜索树——AVL、红黑树、B树、B+树
  • WinForm真入门(5)——控件的基类Control
  • 使用 Swift 实现 LRU 缓存淘汰策略
  • React编程模型:Project Reactor深度解析
  • Java的基本语法
  • 006贪心——算法备赛
  • 蓝桥杯 2023 省赛 B 组 E 题。
  • KubeVirt虚拟化管理架构
  • 热更新简介+xLua基础调用
  • 《AI大模型开发笔记》MCP快速入门实战(一)
  • 英语学习:读科技论文的难处
  • JSON介绍
  • 免费送源码:Java+ssm+MySQL SpringBoot社区配送服务系统小程序 计算机毕业设计原创定制