繁体   English   中英

NodeJS嵌套事件侦听器

[英]NodeJS Nested Event listeners

我不明白,为什么通过嵌套事件监听器传递参数到事件发射器流所有值? 是因为它必须通过上层'join'监听器吗? 变量信息存储在某处吗?

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.once('broadcast',...)替换channel.on('broadcast',...)。 因此,使用“一次”订阅,一旦处理,将删除“广播”听众。

对于每个“加入”订阅,我们都有一个“广播”订阅。 让我们说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);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM