NodeJS嵌套事件侦听器

我不明白,为什么通过嵌套事件监听器传递所有值的事件发射器的参数? 是因为它必须通过上层的“join”监听器吗? variables信息是否存储在某个地方?

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); 

这创build了TCP服务器。 那么你可以jointellnet localhost 7000

请用channel.once('broadcast',…)replacechannel.on('broadcast',…)。 所以使用“一次”订阅,一旦处理,将删除“广播”监听器。

对于每个“join”订阅,我们都有一个“广播”订阅。 比方说,3个join后将有三个订阅“广播”事件。 所以当发射器发射“广播”时,所有三个订阅被调用。 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); 

你可能考虑分离joindata事件的一个原因是在每个事件中做不同的事情。 例如,在这个要点( https://gist.github.com/nicholascloud/603ae8ead6769ad9b8b5 )中,我join时跟踪客户端,然后使用data处理程序向所有客户端广播消息,除了发送者。 像这样: https : //i.imgur.com/pIDy3JD.png

这可以通过很多方式来完成,所以不要担心具体的实现。

另外请注意,我的频道订阅不是嵌套的。 只要它们都在服务器连接之前完成,我的频道就会收到所有触发的事件。