Node.js中Function与EventEmitter的适用场景及用法差异咨询
Function和EventEmitter的适用场景区分
什么时候用普通Function
当你明确知道逻辑执行完成后需要触发的操作、调用方和被调用方强关联、仅需要一对一触发的场景,直接使用普通Function即可,逻辑更直观、没有额外开销,也不会产生冗余代码。
示例:学生成绩录入后需要给家长发通知,逻辑固定不需要扩展的场景:
// 公用通知函数,所有学生实例都可以直接调用 function sendScoreNotification(studentName, score) { console.log(`通知家长:${studentName}本次考试成绩为${score}`) } class Student { constructor(name) { this.name = name } // 所有学生共享setScore方法,没有冗余 setScore(score) { this.score = score // 明确知道要触发的逻辑,直接调用函数即可 sendScoreNotification(this.name, score) } } const studentMax = new Student('Max') const studentLily = new Student('Lily') studentMax.setScore(95) studentLily.setScore(88)
什么时候用EventEmitter
当你编写核心逻辑时,不知道未来会有多少个地方需要响应这个动作、甚至使用你的代码的第三方开发者也需要加自定义响应逻辑、需要一对多通知的场景,就适合用EventEmitter。它可以做到核心逻辑和扩展逻辑完全解耦,新增响应不需要改动原有核心代码。
示例:还是学生成绩录入的场景,后续需要叠加奖学金提名、补考通知、第三方系统同步等多个响应逻辑,不需要修改原有Student类的代码:
const { EventEmitter } = require('events') // 核心Student类只需要负责抛出事件即可 class Student extends EventEmitter { constructor(name) { super() this.name = name } setScore(score) { this.score = score // 只发事件通知,不需要关心谁要订阅这个事件 this.emit('scoreUpdated', this.name, score) } } const studentMax = new Student('Max') // 扩展1:通知家长 studentMax.on('scoreUpdated', (name, score) => { console.log(`通知家长:${name}本次考试成绩为${score}`) }) // 扩展2:奖学金提名 studentMax.on('scoreUpdated', (name, score) => { if(score >= 90) console.log(`教务系统:提名${name}申请一等奖学金`) }) // 扩展3:补考通知 studentMax.on('scoreUpdated', (name, score) => { if(score < 60) console.log(`班主任:通知${name}参加补考`) }) // 后续新增任何响应逻辑,只需要加新的订阅即可,完全不用动Student类的代码 studentMax.setScore(95)
对之前疑问的解释
你提到的网友的原话是完全准确的:
当你开发类库或内部API时,它允许你的代码其他部分(或使用你代码的人员)订阅事件,而你无需提前知晓这些订阅需求。
但你上面的使用场景确实没有意义。
你最开始给出的示例里,绑定完say_hi事件的回调后马上触发,整个逻辑是闭环的没有任何扩展空间,和直接定义一个普通函数然后调用没有任何区别,属于EventEmitter的滥用,当然没有意义。
核心判断标准:
- 需要明确指定执行的固定逻辑、一对一触发,用Function
- 需要一对多通知、后续要扩展响应逻辑、要给使用者留自定义扩展空间,用EventEmitter
内容的提问来源于stack exchange,提问作者Mohsen Movahed
相关产品推荐
相关产品推荐

