Node.js events emitter.removeListener

🌙
手机阅读
本文目录结构

Node.js events emitter.removeListener(eventName, listener)

新增于: v0.1.26

  • eventName < string> | < symbol>
  • listener < Function>
  • 返回: < EventEmitter> 从名为 eventName 的事件的监听器数组中移除指定的 listener。
const callback = (stream) => {
  console.log('已连接');
};
server.on('connection', callback);
  // ...
server.removeListener('connection', callback);

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

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

const myEmitter = new MyEmitter();

const callbackA = () => {
  console.log('A');
  myEmitter.removeListener('event', callbackB);
};

const callbackB = () => {
  console.log('B');
};

myEmitter.on('event', callbackA);

myEmitter.on('event', callbackB);

// callbackA 移除了监听器 callbackB,但它依然会被调用。
// 触发时内部的监听器数组为 [callbackA, callbackB]
myEmitter.emit('event');
// 打印:
//   A
//   B

// callbackB 现已被移除。
// 内部的监听器数组为 [callbackA]
myEmitter.emit('event');
// 打印:
//   A

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

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

const EventEmitter = require('events');
const ee = new EventEmitter();
function pong() {
    console.log('pong - 阿西河前端教程');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');

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

注意:addEventListener()方法添加的匿名函数是无法移除的,所以添加时应使用函数名添加:

const EventEmitter = require('events');
const ee = new EventEmitter();
ee.addEventListener("click", function () {
    console.log('axihe.com');
}, false);
//匿名函数无法移除
ee.removeEventListener("click", function () {
    console.log('axihe.com');
}, false);

更多node event中的方法属性和事件,可以进入 node events EventEmitter 类 进行查看


更多内容请参考:Node.js events 事件触发器,或者通过 点击对应菜单 进行查看;



AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

目前重心已经放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>