zoukankan      html  css  js  c++  java
  • Nodejs事件无法remove的问题

    最近在事件处理时遇到一个问题,添加事件监听没有问题,一切正常。但是在remove的时候,却怎么也删除不了。调试代码后发现是匿名函数的原因。例如有如下代码:

     1 import { EventEmitter, } from 'events';
     2 
     3 class EventBase extends EventEmitter {
     4   constructor() {
     5     super();
     6   }
     7 }
     8 
     9 let EventInstance = new EventBase();
    10 
    11 class Operator {
    12   constructor() {}
    13 
    14   onTouchStart(e) {...}
    15 
    16   bindEvent() {
    17     // 注意bind(this)之后就不是OnTouchStart了,而是一个匿名的函数
    18     EventInstance.on(this.onTouchStart.bind(this));
    19   }
    20 
    21   unBindEvent() {
    22     // 这时无法成功
    23     EventInstance.removeListener(this.onTouchStart);
    24 
    25     /**
    26      * 即使这样也无法成功
    27      * EventInstance.removeListener(this.onTouchStart.bind(this));
    28      */
    29   }
    30 }

    正确的做法如下:

     1 import { EventEmitter, } from 'events';
     2 
     3 class EventBase extends EventEmitter {
     4   constructor() {
     5     super();
     6   }
     7 }
     8 
     9 let EventInstance = new EventBase();
    10 
    11 class Operator {
    12   constructor() {
    13     // 提前绑定
    14     this.onTouchStart = this.onTouchStart.bind(this);
    15   }
    16 
    17   onTouchStart(e) {...}
    18 
    19   bindEvent() {
    20     // 这样就可以了
    21     EventInstance.on(this.onTouchStart);
    22   }
    23 
    24   unBindEvent() {
    25     // 顺利解除
    26     EventInstance.removeListener(this.onTouchStart);
    27   }
    28 }
  • 相关阅读:
    抽象类的练习
    Java异常处理1
    接口的应用
    接口之代理模式
    接口之工厂方法的设计模式
    给ubuntu系统换新装
    2的幂次方表示(OJ 8758)
    Fibonacci【矩阵乘法】(POJ 3070)
    斐波那契公约数(luogu 1306)
    枪战Maf (bzoj 1124)
  • 原文地址:https://www.cnblogs.com/Farmer-D/p/5864910.html
Copyright © 2011-2022 走看看