• eventName {string|symbol}
    • listener {Function}
    • 返回: {EventEmitter}

    从名为 eventName 的事件的监听器数组中移除指定的 listener

    1. const callback = (stream) => {
    2. console.log('已连接');
    3. };
    4. server.on('connection', callback);
    5. // ...
    6. server.removeListener('connection', callback);

    removeListener() 最多只会从监听器数组中移除一个监听器。 如果监听器被多次添加到指定 eventName 的监听器数组中,则必须多次调用 removeListener() 才能移除所有实例。

    一旦事件被触发,所有绑定到该事件的监听器都会按顺序依次调用。 这意味着,在事件触发之后、且最后一个监听器执行完成之前,removeListener()removeAllListeners() 不会从 emit() 中移除它们。 后续事件的行为符合预期。

    1. const myEmitter = new MyEmitter();
    2. const callbackA = () => {
    3. console.log('A');
    4. myEmitter.removeListener('event', callbackB);
    5. };
    6. const callbackB = () => {
    7. console.log('B');
    8. };
    9. myEmitter.on('event', callbackA);
    10. myEmitter.on('event', callbackB);
    11. // callbackA 移除了监听器 callbackB,但它依然会被调用。
    12. // 触发时内部的监听器数组为 [callbackA, callbackB]
    13. myEmitter.emit('event');
    14. // 打印:
    15. // A
    16. // B
    17. // callbackB 现已被移除。
    18. // 内部的监听器数组为 [callbackA]
    19. myEmitter.emit('event');
    20. // 打印:
    21. // A

    因为监听器是使用内部数组进行管理的,所以调用它将更改在删除监听器后注册的任何监听器的位置索引。 这不会影响调用监听器的顺序,但这意味着需要重新创建由 emitter.listeners() 方法返回的监听器数组的任何副本。

    如果单个函数作为处理程序多次添加为单个事件(如下例所示),则 removeListener() 将删除最近添加的实例。 在示例中,删除了监听器 once('ping')

    1. const ee = new EventEmitter();
    2. function pong() {
    3. console.log('pong');
    4. }
    5. ee.on('ping', pong);
    6. ee.once('ping', pong);
    7. ee.removeListener('ping', pong);
    8. ee.emit('ping');
    9. ee.emit('ping');

    返回对 EventEmitter 的引用,以便可以链式调用。