gpt4 book ai didi

javascript - NodeJS 嵌套事件监听器

转载 作者:行者123 更新时间:2023-11-30 12:35:16 26 4
gpt4 key购买 nike

我不明白,为什么将参数传递给带有嵌套事件监听器的事件发射器会流式传输所有值?是因为它必须通过上层的“加入”监听器吗?可变信息是否存储在某处?

var events = require('events');
var net = require('net');
var channel = new events.EventEmitter();
var i = 0;
var subscriptions;

// IF we have two connections
channel.on('join', function(subs) { // Upper Listener

console.log(subs); // -> output 0 when first client joined and 1 for second

channel.on('broadcast', function(subs2) { // lower listener
console.log(subs); // Stream of all connections: -> 0 and 1 ???
console.log(subs2); // Outputs last connection -> 1
});
});

var server = net.createServer(function(client) {

subscriptions = i++; // variable to pass

channel.emit('join', subscriptions); // pass the same variable

client.on('data', function(data) {
channel.emit('broadcast', subscriptions); // pass the same variable
});
});
server.listen(7000);

这将创建 TCP 服务器。然后你可以加入 tellnet localhost 7000,

最佳答案

请将 channel.on('broadcast',...) 替换为 channel.once('broadcast',...)。因此,使用“一次”订阅将在处理后删除“广播”监听器。

对于每个“加入”订阅,我们都有一个“广播”订阅。可以说在 3 次加入后,将有 3 次订阅“广播”事件。因此,当发射器以“广播”方式发射时,将调用所有三个订阅。 sub 的值为之前的值,只更新 sub2。

修改后的代码如下所示。我放了一些额外的控制台日志以便更好地理解。

var events = require('events');
var net = require('net');
var channel = new events.EventEmitter();
var i = 0;
var subscriptions;

// IF we have two connections
channel.on('join', function(subs) { // Upper Listener

console.log("join:subs:"+subs); // -> output 0 when first client joined and 1 for second

channel.once('broadcast', function(subs2) { // lower listener
console.log('came to broadcast');
console.log("broadcast:subs:" + subs); // Stream of all connections: -> 0 and 1 ???
console.log("broadcast:subs2:"+subs2); // Outputs last connection -> 1
});
});

var server = net.createServer(function(client) {

subscriptions = i++; // variable to pass

channel.emit('join', subscriptions); // pass the same variable

client.on('data', function(data) {
console.log('received data:'+data);
channel.emit('broadcast', subscriptions); // pass the same variable
});
});
server.listen(7000);

关于javascript - NodeJS 嵌套事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26268615/

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