Node.js中如何移除指定单个event listener而不删除同事件名其他监听器
核心原因
你无法精准删除指定监听器的根本原因是 EventEmitter.on() 方法返回的是 emitter 实例本身(也就是你场景里的client对象),你存在foobar和foofoobar变量里的是同一个client实例,removeListener自然无法通过这两个变量区分你要删除的是哪一个监听函数。
同时你之前调用removeListener没有达到预期,大概率是只传入了事件名没有传入对应监听函数的引用:原生Node.js的removeListener要求同时传入事件名称和监听函数的引用才能精准删除单个监听器,仅传入事件名的话部分封装实现会直接清空该事件下绑定的所有监听器。
注意:你给出的示例代码中
.on的调用漏了参数之间的逗号,正确语法是client.on("foo", 回调函数),实际编写时需要修正否则会报语法错误。
正确实现方式
只需要把需要后续移除的监听函数单独声明为变量,不要直接用匿名内联函数传入即可:
// 单独声明监听函数,保留函数引用 const handleBar = () => { console.log("bar") }; const handleFooBar = () => { console.log("foobar") }; // 绑定事件 client.on("foo", handleBar); client.on("foo", handleFooBar);
需要移除指定监听器时,传入对应函数引用即可,不会影响同事件下的其他监听器:
// 仅移除handleFooBar对应的监听器 client.removeListener("foo", handleFooBar);
TypeScript适配说明
该实现在TS下完全可用,你只需要给监听函数加上对应事件的类型标注即可,逻辑和原生Node.js完全一致,不存在兼容性问题。
内容的提问来源于stack exchange,提问作者SomePerson
相关产品推荐
相关产品推荐

