阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      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 事件触发器,或者通过 点击对应菜单 进行查看;


      目录
      本文目录
      目录