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