维护套接字侦听器的标准方法

时间:2017-09-26 21:14:00

标签: javascript node.js socket.io

我有一个node.js socket.io应用程序,我有一些不同的事件和监听器。现在这就是我的做法。

class testEmitterClass extends events {
}

const testEmitter = new testEmitterClass();

io.on('connection', function (socket) {

    console.log('connected');

    let dnsInactiveTermsListener = function (dnsInactiveTerms) {
        socket.emit(socketEvents.DNS_INACTIVE_TERMS, dnsInactiveTerms);
    };

    let checkpointInactiveTermsListener = function(checkpointInactiveTerms) {
        socket.emit(socketEvents.CHECKPOINT_INACTIVE_TERMS, checkpointInactiveTerms);
    };

    let dnsActiveTermsListener = function (dnsActiveTerms) {
        socket.emit(socketEvents.DNS_ACTIVE_TERMS, dnsActiveTerms);
    };

    let checkpointActiveTermsListener = function(checkpointActiveTerms) {
        socket.emit(socketEvents.CHECKPOINT_ACTIVE_TERMS, checkpointActiveTerms);
    };

    let dnsCountListener = function (dnsCountStreaming) {
        socket.emit(socketEvents.DNS_COUNT, dnsCountStreaming);
    };

    testEmitter.on(socketEvents.CHECKPOINT_ACTIVE_TERMS, checkpointActiveTermsListener);
    testEmitter.on(socketEvents.DNS_INACTIVE_TERMS, dnsInactiveTermsListener);
    testEmitter.on(socketEvents.CHECKPOINT_INACTIVE_TERMS, checkpointInactiveTermsListener);
    testEmitter.on(socketEvents.DNS_ACTIVE_TERMS, dnsActiveTermsListener);
    testEmitter.on(socketEvents.DNS_COUNT, dnsCountListener);

    socket.on('disconnect', function () {

        console.log('disconnected');

        testEmitter.removeListener(socketEvents.DNS_INACTIVE_TERMS, dnsInactiveTermsListener);
        testEmitter.removeListener(socketEvents.DNS_ACTIVE_TERMS, dnsActiveTermsListener);
        testEmitter.removeListener(socketEvents.DNS_COUNT, dnsCountListener);
        testEmitter.removeListener(socketEvents.CHECKPOINT_INACTIVE_TERMS, checkpointInactiveTermsListener);
        testEmitter.removeListener(socketEvents.CHECKPOINT_ACTIVE_TERMS, checkpointActiveTermsListener);

    })

});

testemitter是一个单一实例,它在其他地方发送事件并使用socket.io发送到客户端

有没有办法在某处维护单个侦听器列表,以便可以更好地维护此代码?如何将事件映射到侦听器,以便在客户端与socket.io断开连接时添加和删除它们,而不会造成混乱。

socketEvents只是事件名称的对象。

const DNS_COUNT = 'dnsCount';
const DNS_INACTIVE_TERMS = 'dnsInactiveTerms';
const DNS_ACTIVE_TERMS = 'dnsActiveTerms';
const CHECKPOINT_INACTIVE_TERMS = 'checkpointInactiveTerms';
const CHECKPOINT_ACTIVE_TERMS = 'checkpointActiveTerms';

module.exports = {
    DNS_COUNT,
    DNS_INACTIVE_TERMS,
    CHECKPOINT_INACTIVE_TERMS,
    DNS_ACTIVE_TERMS,
    CHECKPOINT_ACTIVE_TERMS
};

希望我清楚明白,谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你可以改变你做事的整个方式。您可以将消息广播到所有连接的套接字,而不是为每个连接的套接字注册事件处理程序。所以,我认为你可以用这个替换你展示的所有内容:

class testEmitterClass extends events {
}

const testEmitter = new testEmitterClass();

const notifications = [
    CHECKPOINT_ACTIVE_TERMS,
    DNS_INACTIVE_TERMS,
    CHECKPOINT_INACTIVE_TERMS,
    CHECKPOINT_INACTIVE_TERMS,
    DNS_COUNT
];

for (let msg of notifications) {
    testEmitter.on(socketEvents[msg], function(data) {
        // send this message and data to all currently connected sockets
        io.emit(socketEvents[msg], data);
    });
}

还要注意代码已经DRYed使用了一个可以循环的消息表,而不是一遍又一遍地重复相同的语句。因此,现在要添加,删除或编辑您的一条通知消息,您只需在一个地方修改该表。

如果socketEvents(你没有显示)只是一个包含这5个属性的对象,那么你甚至可以通过迭代{{1}的属性来删除notifications数组}。

这将进一步减少代码:

socketEvents