javascript - 维护套接字监听器的标准方法

标签 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);

    })

});

测试发射器是一个单一实例,它在其他地方发出事件并使用 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
};

希望我说清楚了,谢谢!

最佳答案

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

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 个属性的对象,那么您甚至可以通过迭代来删除 notifications 数组socketEvents 的属性。

这将进一步减少代码:

class testEmitterClass extends events {
}

const testEmitter = new testEmitterClass();

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

关于javascript - 维护套接字监听器的标准方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46435932/

相关文章:

node.js - Mongoose 找到所有满足条件的子文档

javascript - JS : Node. js 和 Socket.io - 全局变量和架构

javascript - 使用 Express.js v4 和 Socket.io v1 的 session

javascript - 带有 socketio : wht doesn't publisher publish message? 的 nodejs 中的 redis pubsub

javascript - 在 Canvas 上绘制数组元素的纬度、经度

javascript - 我在 Rails 4 中使用 form_for 的 AJAX 请求做错了什么?

javascript - 为什么我的背景图片这么大而且拉长了?

javascript - 如何在上传图片后更改 DIV 的背景?

javascript - 如何 : Produce mongoDB query string for the fields dynamically from a javascript app

javascript - 我有最小和最大数量,如何生成 n 个数组