有C#开发背景,如何在JavaScript中实现自定义事件的创建、订阅与分发?
方案1:基于浏览器原生EventTarget实现(无需第三方依赖,现代浏览器均支持)
EventTarget是所有支持事件的DOM对象的基类,也可以直接实例化或者继承来实现自定义事件,完全可以脱离DOM元素使用:
// 1. 创建事件目标载体,对应C#中声明事件的类实例 const eventHub = new EventTarget(); // 2. 定义你的委托函数 function myFunction() { console.log("delegated call achieved!"); } // 订阅逻辑位置,对应C#的 myEvent += myFunction function whatever1() { eventHub.addEventListener('onMyConditionIsMet', myFunction); } // 触发逻辑位置,对应C#的 myEvent?.invoke() function whatever2() { eventHub.dispatchEvent(new Event('onMyConditionIsMet')); }
如果需要取消订阅,调用eventHub.removeEventListener('onMyConditionIsMet', myFunction)即可。
方案2:Node.js环境下使用内置EventEmitter
Node.js标准库自带的events模块就是专门用于自定义事件的实现,用法更贴近C#的事件语法:
const { EventEmitter } = require('events'); // 1. 创建事件载体 const eventHub = new EventEmitter(); function myFunction() { console.log("delegated call achieved!"); } // 订阅 function whatever1() { eventHub.on('onMyConditionIsMet', myFunction); } // 触发,内部会自动判断是否有订阅者,无订阅时不会报错 function whatever2() { eventHub.emit('onMyConditionIsMet'); }
取消订阅用eventHub.off('onMyConditionIsMet', myFunction)。
方案3:跨环境极简自定义实现(完全无依赖,和C#委托逻辑完全对齐)
如果不想依赖环境内置API、完全规避DOM相关逻辑,只需要实现你需要的订阅、触发逻辑,手写10行左右代码即可,完全匹配你C#无参委托事件的使用习惯:
class SimpleEvent { #callbacks = []; // 订阅,对应 += 操作 on(callback) { this.#callbacks.push(callback); } // 取消订阅,对应 -= 操作 off(callback) { this.#callbacks = this.#callbacks.filter(cb => cb !== callback); } // 触发,对应 ?.invoke() invoke() { this.#callbacks.forEach(cb => cb()); } } // 使用示例 const myEvent = new SimpleEvent(); function myFunction() { console.log("delegated call achieved!"); } function whatever1() { myEvent.on(myFunction); // 对应C# myEvent += myFunction } function whatever2() { myEvent.invoke(); // 对应C# myEvent?.invoke(),无订阅时无副作用 }
内容的提问来源于stack exchange,提问作者rustyBucketBay
相关产品推荐
相关产品推荐

