求教为何Nodejs EventEmitter的默认移除listener的事件无效
求教为何Nodejs EventEmitter的默认移除listener的事件无效
var EventEmitter = require(“events”).EventEmitter; var ee = new EventEmitter(); ee.on(“removeListener”, function (evtName) { console.log(“Removed Listener: " + evtName);}); 以上是EventEmitter的默认事件"removeListener”。但是我执行任何移除Listener的操作都不会触发上面的事件,是我哪里搞错了吗?求指教
以下是移除listener代码: function foo(){ console.log(“It is a test!”); } ee.on(“test”, foo); ee.removeListener(“test”, foo);
当然可以。让我们来详细分析一下为什么在你的代码中 removeListener
事件没有被触发。
首先,我们需要明确 removeListener
事件的行为。当你调用 removeListener
或 removeAllListeners
方法时,会触发一个名为 removeListener
的事件(前提是该事件已经被监听)。这个事件的主要用途是在内部实现中进行一些清理工作,而不是为了通知外部用户。
示例代码
var EventEmitter = require('events').EventEmitter;
var util = require('util');
// 创建一个新的EventEmitter实例
var ee = new EventEmitter();
// 监听名为'removeListener'的事件
ee.on("removeListener", function (eventName, listener) {
console.log("Removed Listener for event: " + eventName + " with listener: " + listener);
});
// 定义一个函数foo
function foo() {
console.log("It is a test!");
}
// 将foo函数绑定到'test'事件
ee.on("test", foo);
// 移除'test'事件的foo函数监听器
ee.removeListener("test", foo);
// 输出结果
console.log("After removing listener:");
ee.emit("test"); // 尝试触发'test'事件
解释
-
创建EventEmitter实例:
var ee = new EventEmitter();
-
监听’removeListener’事件:
ee.on("removeListener", function (eventName, listener) { console.log("Removed Listener for event: " + eventName + " with listener: " + listener); });
这里我们监听了
removeListener
事件,这样当有监听器被移除时,我们就能得到通知。 -
定义并添加监听器:
function foo() { console.log("It is a test!"); } ee.on("test", foo);
我们定义了一个函数
foo
并将其添加为'test'
事件的监听器。 -
移除监听器:
ee.removeListener("test", foo);
使用
removeListener
方法移除'test'
事件的foo
函数监听器。 -
输出结果:
console.log("After removing listener:"); ee.emit("test"); // 尝试触发'test'事件
在移除监听器后,尝试触发
'test'
事件。由于foo
已经被移除,所以不会有任何输出。
问题分析
在你的原始代码中,你只监听了 removeListener
事件,但没有正确地触发这个事件。实际上,removeListener
事件是为了内部使用而设计的,它不是用来通知外部用户的。如果你想在移除监听器时得到通知,你应该自己实现这个逻辑。
希望这能帮助你理解 EventEmitter
的 removeListener
事件以及如何正确地使用它。
你的Node版本是多少的?
估计 是 你得remove事件,在没有监听前,已经被移除了,尝试用 process.nextTick
被楼上的仁兄发现了我的低级错误,版本太低
在 Node.js 的 EventEmitter
中,默认的 removeListener
事件并不会在每次调用 removeListener
方法时触发。相反,它仅在监听器被移除时触发。
你在代码中添加了一个 removeListener
监听器,但 removeListener
是一个特殊的事件,用于通知你某个监听器已经被移除。如果你希望在每次调用 removeListener
方法时都触发某种行为,你需要手动处理这一点。
以下是一些示例代码,以帮助你更好地理解:
const EventEmitter = require('events');
class CustomEventEmitter extends EventEmitter {
removeListener(eventName, listener) {
super.removeListener(eventName, listener);
this.emit('customRemoveListener', eventName, listener);
}
}
const ee = new CustomEventEmitter();
ee.on('customRemoveListener', (eventName, listener) => {
console.log(`Removed Listener: ${eventName}, Listener: ${listener}`);
});
function foo() {
console.log('It is a test!');
}
ee.on('test', foo);
ee.removeListener('test', foo);
在这个例子中,我们创建了一个继承自 EventEmitter
的类 CustomEventEmitter
,并重写了 removeListener
方法,在每次调用 removeListener
时手动触发一个名为 customRemoveListener
的事件。这样你就可以在每次移除监听器时得到通知,并进行相应的处理。
如果不需要这么复杂的逻辑,你只需要理解 removeListener
默认不会触发你注册的 removeListener
事件,而只是通知你某个监听器已经被移除了。