【问题标题】:How to wrap a "method" in Javascript?如何在 Javascript 中包装“方法”?
【发布时间】:2020-12-13 02:47:20
【问题描述】:

我无法绕过包装 eventEmitter2 库的 .on 方法来传递我的自定义变量。

  • 尝试#1

    let qHandler = new EventEmitter2({ wildcard: true });
    const qHandlerWrapper = (queueName)=>{  
        qHandler.on = (eventName,callbackFunc)=>{
            return qHandler.on(`${queueName}.${eventName}`,callbackFunc)
        }
        return qHandler
    }
    

    这里的代码进入无限递归调用。

  • 尝试 #2 - 克隆 qHandler 对象

    let qHandler = new EventEmitter2({ wildcard: true });
    const qHandlerOnMain = require('lodash/clonedeep')(qHandler)
    const qHandlerWrapper = (queueName)=>{
        qHandler.on = (eventName,callbackFunc)=>{
            return qHandlerOnMain.on(`${queueName}.${eventName}`,callbackFunc)
        }
        return qHandler
    }
    
    • 这稍微解决了我的问题,但无法使用qHandler的其他方法,例如onAny

    原因: 我已经在 qHandlerOnMain 对象下注册了所有事件并返回另一个 - qHandler, 这会导致qHandler.onAny找到在qHandler 下注册的任何事件。

【问题讨论】:

    标签: javascript dom-events javascript-objects eventemitter


    【解决方案1】:

    我不确定您在这里实际尝试做什么,但使用私有库方法不是一个好主意,因为我们可能会在不久的将来更改它的签名。此外,这绝对是修复 EventEmitter2 原型的糟糕方法。这将影响所有其他实例。许多其他模块使用 EventEmitter2。您应该继承 EventEmitter2 来更改 on 方法的实现以达到自己的目的。 但根据你的代码:

    const originalOn= EventEmitter2.prototype.on;
    
    const qHandlerWrapper = (queueName)=>{        
        // this is a bad idea!!!
        EventEmitter2.prototype.on = function(type, listener, options) {
        // wildcard emitter accepts an array as event path
            return originalOn.call(this, [queueName, type], listener, options);
        };
    
        return qHandler;
    }
    

    我无法提供更合适的解决方案,因为我不了解您的需求。你为什么要克隆一个 Eventemitter 实例,你试图将 queueName 绑定到 on 方法的目的是什么。

    【讨论】:

    • 我同意你的子类想法以避免签名更改,但你不认为你上面的代码会导致无限递归?
    • 没有递归,因为const originalOn= EventEmitter2.prototype.on; 应该放在模块的顶层,在模块初始化时只调用一次。
    【解决方案2】:

    最后,我必须在 eventEmitter2 prototype

    上添加我的包装器代码
    let qHandler = new EventEmitter2({ wildcard: true });
      
    const qHandlerWrapper = (queueName)=>{  
        EventEmitter2.prototype.on = function(type, listener, options) {
          return this._on(`${queueName}.${type}`, listener, false, options);
        };
        return qHandler;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 2010-09-24
      • 2016-02-12
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2011-06-19
      相关资源
      最近更新 更多