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

手写发布订阅者模式

interfaceI{events:Map<string,{callback:Function;once:boolean}[]>on:(event:string,callback:any,once?:boolean)=>voidemit:(event:string,...args:any[])=>voidoff:(event:string,callback?:any)=>voidonce:(event:string,callback:Function)=>void}classEmitterimplementsI{events:Map<string,{callback:Function;once:boolean}[]>constructor(){this.events=newMap()}/** * 订阅事件 * @param event 事件名 * @param callback 回调函数 * @param once 是否只执行一次 */on(event:string,callback:Function,once?:boolean){if(this.events.has(event)){this.events.get(event)!.push({callback,once})}else{this.events.set(event,[{callback,once}])}}/** * 发布事件 * @param event 事件名 * @param args 事件参数 */emit(event:string,...args:any[]){if(this.events.has(event)){constcallbacks=this.events.get(event)callbacks.forEach((callback)=>{callback.callback(...args)if(callback.once){this.off(event,callback.callback)}})}}off(event:string,callback?:any){if(this.events.has(event)){if(callback){constcallbacks=this.events.get(event)this.events.set(event,callbacks.filter((item)=>item.callback!==callback))}else{this.events.delete(event)}}}once(event:string,callback:Function){this.on(event,callback,true)}}constemit=newEmitter()functionfn(el:number,isTrue:boolean){console.log('fn',el,isTrue)}// emit.on('test', fn)// emit.on('test', (el: number, isTrue: boolean) => {// console.log('el:', el, isTrue)// })// emit.on('test', (el: number, isTrue: boolean) => {// console.log('el:', el, isTrue)// })// emit.on('test', (el: boolean, isTrue: boolean) => {// console.log('el:', el, isTrue)// })// emit.once('test', fn)// emit.once('test', (el) => {// console.log('el:', el)// })// emit.off('test', fn)// emit.emit('test', 11, true)// emit.emit('test', 11, true)// emit.emit('test', 11, true)// emit.emit('test', 11, true)// emit.emit('test', 11, true)// emit.emit('test', 11, true)// emit.emit('test', 11, true)// function fn(el) {// console.log('el:', el)// }
http://www.jsqmd.com/news/531019/

相关文章:

  • SDMatte设计师效率工具链:与Photoshop动作脚本、Lightroom预设、Canva模板联动设想
  • 4种突破性方案:md2pptx工具解决Markdown到PPT转换的核心难题
  • YOLOE镜像零基础入门:快速掌握三种预测模式(文本/视觉/无提示)
  • 股票复盘神器5.6保姆级教程:从涨停板分析到游资动向追踪的全流程指南
  • CC Switch模型测试功能深度解析:从配置到优化的全流程指南
  • RWKV7-1.5B-g1a实战案例:用它自动生成产品介绍文案与会议纪要摘要
  • 学术PDF处理:OpenClaw+GLM-4.7-Flash自动生成文献综述
  • Notepad Next:跨平台文本编辑的终极解决方案
  • NipaPlay-Reload v1.3.0:3大体验升级与全平台覆盖
  • 解锁像素艺术新可能:Fusion Pixel Font全方位应用指南
  • 元宇宙消防员:扑灭NFT火灾日入十万——软件测试从业者的专业指南
  • 银行客服智能体架构设计与效率优化实战
  • Deequ数据质量监控:State、Analyzers与Metrics的协同架构解析
  • Retinaface+CurricularFace镜像功能体验:一键检测最大人脸并比对
  • nanobot模型量化实战:4GB内存运行OpenClaw高效任务
  • CoPaw模型开源社区贡献指南:问题排查、代码提交与协作规范
  • Wu反走样算法实战解析:从原理到代码实现
  • 2026年口碑好的微生物曝气机推荐厂家 - 品牌宣传支持者
  • FPGA开发效率提升:用Tcl脚本自动检查和格式化你的XDC约束文件
  • 亚马逊ISTA6A是什么标准,ISTA6A测试分哪些包装类型
  • 让旧Mac焕发新生:OpenCore Legacy Patcher完全指南
  • AI 视频 3D 角色皮肤质感秘籍:超写实提示词 + 避坑指南(直接复制可用)
  • 告别闪退和遮挡!UniApp登录页Input组件实战避坑指南(附完整代码)
  • ClickHouse流批一体架构设计:打破实时与离线数据壁垒的三大技术突破
  • 2026年上海高端住宅家庭绿电推荐指南:阳光家庭能源、阳光电源家庭绿电、美墅别墅绿电智慧储能、美的别墅分布式光伏选择指南 - 优质品牌商家
  • 新手避坑指南:为什么你的Elasticsearch刚存的数据查不到?(附排查清单)
  • 零基础玩转WAN2.2文生视频:SDXL风格+中文提示,小白也能做动画
  • 如何彻底告别扩容盘欺诈:F3闪存检测工具完整指南
  • 3步实现智能地址解析:开发者效率提升指南
  • ChatGPT生成PPT的技术实现与优化:从API调用到内容结构化