gpt4 book ai didi

javascript - 如何管理多个监听器?

转载 作者:行者123 更新时间:2023-12-03 02:08:15 24 4
gpt4 key购买 nike

我对听众有疑问。我自己开发的 Node 中的 http 监听器中有多个输入。我用过这样的东西:

...    
server.on(‘connection’, function(){
node.on(‘input’, function(){
// something to manage messages
});
});
...

我想选择何时停止监听器(例如,当它找到特定的 msg.payload 时)。我尝试了“node.once(..”、“node.removeListener(..”),但没有任何效果。你能帮我吗?谢谢。

编辑

所有代码:

var server = http.createServer((request, response) => {
if (request.url == '/log' || request.url == '/log2'){
let body = [];
request.on('error', (err) => {
console.error(err);
}).on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();

response.on('error', (err) => {
console.error(err);
});

response.statusCode = 200;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Content-Type", "text/html");

msg = {_msgid:"1c6db704.811319", topic:request.url ,payload: true};
node.send(msg);


function inputListener(msg) {
console.log(msg.topic + " " + request.url);
if (msg.topic == request.url)
response.end(JSON.stringify(msg.payload));

//node.removeListener('input', inputListener);
}
node.on('input', inputListener);

});
} else {
response.statusCode = 404;
response.end();
}
}).listen(8088);

编辑2

使用这个技巧似乎有效:

            function inputListener(msg) {
if (msg.topic == request.url)
response.end(JSON.stringify(msg.payload));
else
node.once('input', inputListener);
}
node.once('input', inputListener);

最佳答案

node.removeListener() 如果你正确使用它,它会工作得很好,所以我假设你没有正确使用它。要正确使用 .removeListener() 删除一个特定监听器,您必须向其传递您最初监听的消息和相同的函数引用。这意味着您不能使用如下所示的匿名函数引用:

相反,你可以这样做:

server.on('connection', function(){
function inputListener(data) {
// something to manage messages
if (someCondition) {
// if some condition is met, then remove this specific listener
node.removeListener('input', inputListener);
}
}
node.on('input', inputListener);
});

这里的代码创建一个本地函数(每次调用connection处理程序时该函数都是唯一的),然后将其与.on()一起使用。当您想要删除该特定监听器时,您可以将完全相同的函数引用传递给 .removeListener()。可能值得回顾一下 doc for .removeListener() .

node.once() 也有它自己的特定用途。它的作用是在下次事件触发后自动删除事件监听器。如果这正是您想要的情况,那就非常方便了。但是,如果您想测试某些条件,并且仅在满足该条件时才删除事件处理程序,并且有时需要查看该事件的多次出现,那么您不能使用 .once() .

附注您的问题在您的事件名称中包含非法类型的引号。这在 Javascript 中是行不通的。您永远不应该在执行此类处理的文字处理程序中编辑代码。始终使用文本编辑器。

<小时/>

现在您已经包含了更多的实际代码,看来您遇到了并发问题,因为您对所有请求使用相同的 node 对象,因此您无法分辨哪个 input 事件属于哪个请求。您需要解决该问题。

有很多方法可以做到这一点,但这是一种方法。您需要更改 node 对象,以便它接收您发送的唯一 ID,并将其与响应一起返回,以便您可以知道哪个响应对应哪个请求。

const unique = require('node-unique');

var server = http.createServer((request, response) => {
if (request.url == '/log' || request.url == '/log2'){
let body = [];
request.on('error', (err) => {
console.error(err);
}).on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();

response.on('error', (err) => {
console.error(err);
});

response.statusCode = 200;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Content-Type", "text/html");

// generate unique id for this request
let uniqueID = unique();
msg = {_msgid:"1c6db704.811319", topic:request.url ,payload: true, id: uniqueID};
node.send(msg);

function inputListener(msg) {
// ignore if this is not our msg
if (msg.id === uniqueID) {
console.log(msg.topic + " " + request.url);
if (msg.topic == request.url)
response.end(JSON.stringify(msg.payload));

node.removeListener('input', inputListener);
}
}
node.on('input', inputListener);
});
} else {
response.statusCode = 404;
response.end();
}
}).listen(8088);

关于javascript - 如何管理多个监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49698972/

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