Node.js 事件代理

标签 node.js express event-handling socket.io zeromq

我目前有一个可行的解决方案,但是我想从我的服务器代码中删除冗余操作。

我的 Express 应用程序中目前的内容类似于:

// create a ZMQ socket connection
var zmq_sock = require('zmq').socket('dealer').connect(ENDPOINT);

// On a new socket.io connection from a client, register that client as a listener
// to any zmq event, and unregister the client upon disconnect
io.sockets.on('connection', function(socket) {
   var client_callback = function(id, msg) { 
     // some expensive operation
     socket.emit('data', json_data); // socket.io emit to the client
   };
   zmq_sock.on('message', client_callback);
   socket.on('disconnect', function() {
     zmq_sock.removeListener('message', client_callback);
   });
});

问题在于,对于每个 ZMQ 事件,昂贵的操作都是在每个客户端的基础上执行的。我想要做的是以某种方式拥有一个事件代理,每个客户端在代理中注册/取消注册自己,并且当 ZMQ 事件发生时,昂贵的操作发生一次,然后将结果发送给每个客户端。

是否有一种简单的方法可以在 Node 或 Node 模块中执行此操作,以帮助将事件联系在一起?文档、教程或示例也将不胜感激!

最佳答案

您应该使用事件发射器模式。

//Event emitter pattern
var events = require('events');
function EventManager() {
    events.EventEmitter.call(this);
    this.wakeUp = function (message) {
        this.emit(message);
    }
};

var util = require('util');
util.inherits(EventManager, events.EventEmitter);
var manager = new EventManager();
manager.setMaxListeners(0); //max is now infinity

您可以报名参加事件

 manager.on(callback);//callback is a function.

定义后,您可以使用

引发事件
manager.wakeUp(message);

另外,不要忘记注销

manager.removeListener(callback);

这里还有更多 documentation

关于Node.js 事件代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20847870/

相关文章:

mysql - 如何返回Node.js mysql查询连接的响应

mysql - 自定义快速验证器

javascript - 如何将 DOM 与附加事件一起保存?

javascript - response.write() 不会接受字符串。它的行为就像未定义一样

node.js - LDAP JS 身份验证出错

node.js - Express + Passport : req. 用户在每次代码保存时重置

javascript - 与两个 API(nodejs、Angular、express、mysql)的关系

node.js - 通过单独的服务器提供静态文件

c# - 在 C# 中将 "+"键分配给 ADD 按钮

javascript - jQuery 中的全局自定义事件