nodejs的pubsub设计模式

时间:2013-08-13 19:23:11

标签: javascript node.js design-patterns

我正在寻找一个简单的pubsub实现,我可以在nodejs或simliar方式中使用它。 我只需要在服务器端,所以不需要花哨的王子。

我想拥有以下能力:

模块A发布事件'X' 模块B订阅事件'X'而不知道关于模块A的任何信息(除了可能发送了什么参数)

我测试了这个真正完成其工作的简单实现https://github.com/federico-lox/pubsub.js/blob/master/src/pubsub.js

我对一个简单的pubsub实现的当前问题是我不能简单地订阅事件。

如果模块A发布了一个事件但是模块B没有被要求它将永远不会从模块A接收到该事件。模块A在发布事件之前需要模块B它当然是有效的。但这是相当不愉快的。

所以简短形式: 我正在寻找一种与nodejs良好配对的设计模式,并允许我非常独立地编写模块(松散耦合),可以通过事件进行通信。你们建议接近什么?

我也看过nodejs eventemitter但是找不到它的好用(也许我只是看不到它?)

更新 我进一步了解了eventemitter并想出了这个:

emitter.js

var events = require('events');
var emitter = new events.EventEmitter;

module.exports = emitter;

moduleA.js

var emitter = require('./emitter.js');
require('./moduleB.js'); // this shows off my problem

emitter.emit('moduleA');

moduleB.js

var emitter = require('./emitter.js');

emitter.on('moduleA', function () {
    console.log('reacted to event from moduleA');
});

这显示了我的“问题”,但我不确定是否有办法解决。也许我的方法是完全错误的,但在浏览器方面,这应该可行,因为所有代码都是在pageload上预加载的

1 个答案:

答案 0 :(得分:4)

这是基本事件管道使用节点的核心events模块的简单模板。

//modA.js
var events = require('events');
var emitter = new events.EventEmitter;

function funcA() {
  console.log('mod@.funcA executing');
  emitter.emit('funcA');
}

module.exports = {
  funcA: funcA,
  emitter: emitter
};

//modB.js
var events = require('events');
var emitter = new events.EventEmitter;

function funcB() {
  console.log('modB.funcB executing');
  emitter.emit('funcB');
}

module.exports = {
  funcB: funcB,
  emitter: emitter
};

//glue.js
var modA = require('./modA');
var modB = require('./modB');
modA.emitter.on('funcA', modB.funcB);
modA.funcA();

node glue.js
mod@.funcA executing
modB.funcB executing