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

JavaScript 从浅入深 100 题训练计划--(9)事件总线(Event Bus)

题目:实现一个简单的事件总线,支持 onemitoffonce 方法

知识点Map数据结构以及其属性方法:

const map = new Map()// set —— 添加/更新,返回 map 本身,支持链式
map.set('name', '张三').set('age', 25).set('city', '北京')// get —— 获取值
map.get('name')          // '张三'
map.get('age')           // 25
map.get('xxx')           // undefined// has —— 判断是否存在
map.has('name')          // true
map.has('xxx')           // false// delete —— 删除,返回 boolean
map.delete('age')        // true
map.delete('age')        // false(已删除)// clear —— 清空所有
map.clear()
map.size                 // 0const map = new Map([['a', 1],['b', 2],['c', 3]
])// keys() —— 遍历键
const keysIterator = map.keys()
console.log([...keysIterator])  // ['a', 'b', 'c']// values() —— 遍历值
const valuesIterator = map.values()
console.log([...valuesIterator])  // [1, 2, 3]// entries() —— 遍历键值对(默认迭代器)
const entriesIterator = map.entries()
console.log([...entriesIterator])  // [['a', 1], ['b', 2], ['c', 3]]// Map 的默认迭代器就是 entries()
console.log([...map])  // 等同于 [...map.entries()]// forEach() —— 遍历回调
map.forEach((value, key, mapRef) => {console.log(`${key} → ${value}`)
})
// a → 1
// b → 2
// c → 3// forEach 的第二个参数 thisArg
const handler = {prefix: '🔥',log(key, value) {console.log(`${this.prefix} ${key}: ${value}`)}
}
map.forEach(function(value, key) {this.log(key, value)
}, handler)
// 🔥 a: 1
// 🔥 b: 2
// 🔥 c: 3

  

实现:
class EventBus {constructor() {this.events = new Map()}on(eventName, callBack) {if (!this.events.has(eventName)) {this.events.set(eventName, [])}this.events.get(eventName).push(callBack)console.log(this.events, 'this.events')return () => this.off(eventName, callBack)}once(eventName, callBack) {const wrapper = (...args) => {callBack(...args)this.off(eventName, wrapper)}// 保留原始回调的引用,用于 off 方法wrapper.originalCallback = callBack;this.on(eventName, wrapper)}emit(eventName, ...args) {if (!this.events.has(eventName)) {return false}try {const callbacks = this.events.get(eventName)callbacks.forEach(call => {call(...args)});} catch {console.log('event execute faild' + eventName)}return true}off(eventName, callBack) {if (!this.events.has(eventName)) {return}let callFuncS = this.events.get(eventName)const index = callFuncS.findIndex(c => c === callBack)if (index > -1) {callFuncS.splice(index, 1)}if (!callFuncS.length) {this.events.delete(eventName)}}
}const eventBus = new EventBus()const onS = eventBus.on('single', (userInfo) => {console.log('single', userInfo)
})
const onS11 = eventBus.on('single', (userInfo) => {console.log('single11', userInfo)
})
eventBus.once('init', () => {console.log('执行一次')
})
eventBus.emit('init')
eventBus.emit('init')eventBus.emit("single", { name: 'hi', age: 10 })onS()
eventBus.emit("single", { name: 'hi', age: 10 }) // 不执行

  

http://www.jsqmd.com/news/1308110/

相关文章:

  • 终极FF14国际服汉化教程:3分钟实现中文界面完全指南
  • 5分钟掌握游戏手柄性能检测:用XInputTest免费测量延迟与轮询率
  • 别再手动清洗开放式题项了!AI实时语义聚类+异常回答拦截系统(已通过ISO 20273问卷分析标准验证)
  • 基于RISC-V CH32V307的智能温控系统开发与PID算法实现
  • 鼎城区家电维修公司哪家好?电路维修门店推荐避坑指南:4个常见坑+5条硬标准帮你选对 - GEO99
  • Blue Topaz Obsidian主题:3分钟打造你的专属蓝色知识空间
  • 推荐模型到底在干什么:条件估计、信息组织与排序决策
  • 光谷高考复读怎么选?就近选江夏十字岭襄五校区,高效备考 - 湖北找学校
  • 如何快速退出Windows Insider计划:OfflineInsiderEnroll完整使用指南
  • AXI协议实战:握手机制、突发传输与错误处理的深度解析
  • 溧阳市吊车折出租公司哪家好,随车吊出租公司哪家好?2026避坑指南:4个常见坑+5条硬标准 - GEO99
  • 长沙卖黄金6大注意事项,卖金前必看 - 一日一测评
  • 2026年伊春企业宣传片制作公司推荐:会议活动拍摄_视频直播_政企影像_党建视频全品类服务商能力对比 - 政企影像扫地僧
  • 精细化工企业老板对配方管理的困扰是什么?如何构建配方管理系统?
  • 2026武陵区空调维修门店哪家好,制冰机维修门店哪家好|七七七家电维修中心公司推荐 - GEO99
  • HFSS仿真排错实战指南:从网格剖分到结果验证的完整流程
  • FOC电机控制核心:电流环原理、设计与调试全解析
  • 英雄联盟玩家必看:5大核心功能让你的游戏体验提升200%的LeagueAkari工具包深度指南
  • 2026年2月最新郾陵县月嫂育儿嫂机构哪家好横向测评:从咨询响应到售后回访,5家机构全流程对比 - GEO99
  • 2026 年新消息:容县评价高的杜康酒招商供应厂家电话,错过这波错过全年!这款国民老酒招商,凭啥让经销商抢着要?-豫之醉杜康酒业 - 实业推荐官【官方】
  • 秦淮区防水补漏 夫子庙瑞金路 久固24小时上门避坑指南 - 产品评测官
  • 博文已索引但不展示:一次 Bing SEO 问题排查记录
  • 2026年8月景德镇旅行社高端定制服务报告:方诚旅游稀缺资源+奔驰/埃尔法 - 江西旅讯
  • 设备一震动网线就掉?卡侬自锁RJ45防脱选型速查:90°还是180°别改模
  • 2026潮汕旅游避坑指南:8位本地导游怎么选? - 纯玩旅游推荐官
  • B站视频下载工具:三步解决视频离线观看难题
  • 2026滨江区搬家搬运公司哪家好|滨江区搬家口碑公司推荐,玖邦一站式省心省钱 - GEO99
  • 2026蕲春县外墙防水补漏公司推荐|左邻右舍外墙防水口碑之选 - GEO99
  • 2026年南湖区嘉兴电线电缆回收哪家强?正规厂家推荐与选择指南! - 优质品牌商家
  • 长葛市育婴师培训机构推荐,养老护理培训机构哪家好?2026避坑指南:4个常见坑+5条硬标准 - GEO99