Node.js事件代理

时间:2013-12-30 21:29:26

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

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

我目前在我的快递应用程序中的含义如下:

// 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事件发生时,昂贵的操作发生一次,然后结果发送到每个客户端。

在节点或节点模块中有一种简单的方法可以帮助将事件联系在一起吗?文档,教程或示例也将不胜感激!

1 个答案:

答案 0 :(得分:3)

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

//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