簡體   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