【问题标题】:NodeJS Nested Event listenersNodeJS 嵌套事件监听器
【发布时间】:2014-12-03 19:19:04
【问题描述】:

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

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

【问题讨论】:

  • 我不确定我是否理解。 正在创建频道、它的事件和订阅,因此您可以根据需要进行设置。如果您不想,也不必嵌套订阅。

标签: javascript node.js javascript-events stream


【解决方案1】:

请将 channel.on('broadcast',...) 替换为 channel.once('broadcast',...)。所以使用'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);

【讨论】:

    【解决方案2】:

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

    这可以通过多种方式实现,所以不必担心具体的实现。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2014-02-21
      相关资源
      最近更新 更多