如何解决如何在Javascript中包装“方法”?
我无法绕开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 }
原因:我已将所有事件注册在
qHandlerOnMain
对象下,并返回另一个-qHandler
, 导致qHandler.onAny
不能找不到查找在qHandler
下注册的任何事件。
解决方法
我不确定您在这里实际要做什么,但是使用私有库方法不是一个好主意,因为我们可能会在不久的将来更改其签名。此外,这绝对是修复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],options);
};
return qHandler;
}
由于我不了解您的需求,因此我无法提供更合适的解决方案。为什么要克隆Eventemitter实例,为什么要将queueName绑定到on方法?
,最后,我必须在eventEmitter2 prototype
上添加包装器代码let qHandler = new EventEmitter2({ wildcard: true });
const qHandlerWrapper = (queueName)=>{
EventEmitter2.prototype.on = function(type,options) {
return this._on(`${queueName}.${type}`,false,options);
};
return qHandler;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。