【发布时间】:2016-12-06 15:39:49
【问题描述】:
有没有办法检查 node.js 中的对象是否已经存在侦听器? 我想实现以下场景:
- 获取db的对象
- 做一些操作
- 如果尚未添加相同的侦听器,则添加侦听器,例如错误、结果、排水等 [假设对于所有操作,侦听器操作都相同]
我想优化侦听器的添加,使我们尝试添加现有侦听器时不会添加新侦听器。节点文档说“不检查是否已经添加了侦听器。传递相同 eventName 和侦听器组合的多个调用将导致侦听器被添加和调用多次。”
有办法解决吗?
[编辑]-添加一些示例代码
connpool.getConnection(function(err, connection) {
var querystr = "Some valid SQL query";
connection.execute(querystr, data, function(err, rows) {
if (err) {
console.error(err);
}
connection.on('error', function(err){onErr(err,connection);});
do some stuff
cleanup(connection);
});
})
var onErr = function(err, connection) {
console.error({"Error message"});
connection.release();
cleanup(connection);
};
var cleanup = function(conn) {
conn.removeListener('error',onErr);
};
Connection 将包含一个 db 连接,它来自一个外部包。在语句 connection.on('error', function(err){onErr(err,connection);});我正在使用匿名函数,因为我需要将一个额外的参数传递给清理方法。在清理期间,我没有得到函数的处理程序,因为我使用的是匿名函数。
【问题讨论】:
-
只需检查listeners currently bound to the particular event 以查看您要添加的是否存在。使用
emitter.listeners(eventName)。 -
@CoolBlue:我如何检查受 util.inspect 绑定的侦听器的名称?它将输出返回为:“add 中的侦听器是 [ [Function], { [Function: g] listener: [Function] }, [Function], [Function] ]”
-
只需使用对侦听器函数的引用来检查
emitter.listeners(eventName)返回的侦听器数组。请参阅下面的答案... -
不幸的是,我正在为侦听器处理程序使用匿名函数。这些事件是从 mysql 包中抛出的,它们只接受 err 作为参数。我将编辑问题以包含一些代码
-
您可以将
onErr和cleanup函数移动到getConnection回调的范围内。然后您可以使用(未包装的)onErr作为侦听器,但将其签名更改为onErr(err)并按词法访问connection。
标签: node.js event-handling listener addeventlistener