gpt4 book ai didi

node.js - 如果尚未添加监听器并且监听器处理程序是匿名函数,则在 nodeJS 中添加监听器

转载 作者:搜寻专家 更新时间:2023-10-31 23:59:53 24 4
gpt4 key购买 nike

有没有办法检查 node.js 中的对象是否已经存在监听器?我想实现以下场景:

  • 获取数据库对象
  • 做一些操作
  • 如果尚未添加相同的监听器,则添加监听器,例如错误、结果、耗尽等[假设对于所有操作,监听器操作都是相同的]

我想以这样一种方式优化监听器的添加,如果我们尝试添加现有监听器,则不会添加新的监听器。 Node 文档说“没有检查是否已经添加了监听器。多次调用传递相同的 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.on('error', function(err){onErr(err,connection);});我正在使用匿名函数,因为我需要将一个额外的参数传递给清理方法。在清理期间,我没有得到该函数的处理程序,因为我使用的是匿名函数。

最佳答案

只要在 Hook 时保留对监听器的引用,就可以检查它是否在 emitter.listeners(eventName) 返回的监听器数组中。

粗略的例子(我相信它会更有效率)

/**
* Created by cool.blue on 8/4/2016.
* http://stackoverflow.com/q/38700859/2670182
*/
const EE = require('events');
const util = require('util');

var host = new EE();

// set up a emitter with n events
const n = 10;
const events = Array.apply(null, Array(n)).map((x, i) => 'event_' + i);

events.forEach(function(e){
host.on(e, function g() {console.log(e)})
});

console.log(util.inspect(host));

// get a reference to one of the listener functions
const target = 'event_3';
var probe = host.listeners(target)[0];

// add a method to only add unique listeners
host.onUnique = function (type, listener){
var slot = this.listeners(type).find(function(l) {
return l === listener
});

if(slot)
return this;

console.log('adding');
return this.on(type, listener)
};

// try to add the same listener again
var count0 = host.listenerCount(target);
var count1 = host.onUnique(target, probe).listenerCount(target);

console.log('added ' + (count1 - count0) + ' listeners'); // added 0 listeners
console.log(util.inspect(host));

// try to add a new listener
count0 = host.listenerCount(target);
count1 = host.onUnique(target, function h(){ console.log('different cb')}).listenerCount(target);

console.log('added ' + (count1 - count0) + ' listeners'); // added 1 listeners
console.log(util.inspect(host));

针对更新后的问题...

你可以做这样的事情......

长话短说

基本思想是为监听器使用非匿名函数,并传递对它的引用以及与外部作用域中实用函数的连接。

const EE = require('events');
const util = require('util');

(function manage(host){

host.name = 'host';
host.release = function(){
console.log('released!')
};

function l(err) {
onErr(err, host, l)
}
l.e = 'error';

host.on('error', l);

if(Math.random() > 0.5)
host.emit('error', new Error('oops!'));

if(l.e)
cleanUp(host, l, 'manage');

})(new EE());

function onErr(e, h, l) {
console.error(`\n${h.name}: ${e.message}`);
h.release();
cleanUp(h, l, 'onError')
}

function cleanUp(h, l, context){
console.log('\n\x1b[33m' + context + '\n'
+ 'before:\t' + h._eventsCount + '\x1b[0m\n' + util.inspect(h));
h.removeListener(l.e, l);
console.log('\n\x1b[33mafter:\t' + h._eventsCount + '\x1b[0m\n' + util.inspect(h));
delete l.e
}

IIFE 只是为了模拟您在外部作用域中没有引用 host (connection) 的情况。

关于node.js - 如果尚未添加监听器并且监听器处理程序是匿名函数,则在 nodeJS 中添加监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38700859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com