求教为何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);


6 回复

当然可以。让我们来详细分析一下为什么在你的代码中 removeListener 事件没有被触发。

首先,我们需要明确 removeListener 事件的行为。当你调用 removeListenerremoveAllListeners 方法时,会触发一个名为 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'事件

解释

  1. 创建EventEmitter实例

    var ee = new EventEmitter();
    
  2. 监听’removeListener’事件

    ee.on("removeListener", function (eventName, listener) {
        console.log("Removed Listener for event: " + eventName + " with listener: " + listener);
    });
    

    这里我们监听了 removeListener 事件,这样当有监听器被移除时,我们就能得到通知。

  3. 定义并添加监听器

    function foo() {
        console.log("It is a test!");
    }
    ee.on("test", foo);
    

    我们定义了一个函数 foo 并将其添加为 'test' 事件的监听器。

  4. 移除监听器

    ee.removeListener("test", foo);
    

    使用 removeListener 方法移除 'test' 事件的 foo 函数监听器。

  5. 输出结果

    console.log("After removing listener:");
    ee.emit("test"); // 尝试触发'test'事件
    

    在移除监听器后,尝试触发 'test' 事件。由于 foo 已经被移除,所以不会有任何输出。

问题分析

在你的原始代码中,你只监听了 removeListener 事件,但没有正确地触发这个事件。实际上,removeListener 事件是为了内部使用而设计的,它不是用来通知外部用户的。如果你想在移除监听器时得到通知,你应该自己实现这个逻辑。

希望这能帮助你理解 EventEmitterremoveListener 事件以及如何正确地使用它。


你的Node版本是多少的?

估计 是 你得remove事件,在没有监听前,已经被移除了,尝试用 process.nextTick

你说得对,版本有点低,我原本是0.8.x 换成了最新版就好了

被楼上的仁兄发现了我的低级错误,版本太低

在 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 事件,而只是通知你某个监听器已经被移除了。

回到顶部