javascript - NodeJS 嵌套事件监听器

标签 javascript node.js stream dom-events

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

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/

相关文章:

javascript - 当用户移动元素时,如何使用 jQuery sortable 更新 div ID?

javascript - 如何使用 JS API 查询 JSON 以返回 JSON 属性?

javascript - Node 模块无法识别为模块

java - DNA 文件转换的位操作

javascript - 使用 Node.js 在流中进行异步调用的问题

linux - 将数据流式传输到 Linux 设备驱动程序中的文件中

javascript - toExponential() 仅适用于具有有效分数的大数

javascript - 如果内部 div 具有特定类,如何使用 javascript 隐藏父 div

node.js - 如何在谷歌云函数中监听多个数据库

javascript - MS SQL 不返回 NodeJS 中的数据