Pla*_*wtf 2 javascript design-patterns node.js
我正在寻找一个可以在 Nodejs 或类似方式中使用的简单 pubsub 实现。我只需要在服务器端使用它,所以不需要花哨的 faye。
我希望拥有以下能力:
模块 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 并得出了这个:
发射器.js
var events = require('events');
var emitter = new events.EventEmitter;
module.exports = emitter;
Run Code Online (Sandbox Code Playgroud)
moduleA.js
var emitter = require('./emitter.js');
require('./moduleB.js'); // this shows off my problem
emitter.emit('moduleA');
Run Code Online (Sandbox Code Playgroud)
moduleB.js
var emitter = require('./emitter.js');
emitter.on('moduleA', function () {
console.log('reacted to event from moduleA');
});
Run Code Online (Sandbox Code Playgroud)
这显示了我的“问题”,但我不确定是否有解决办法。也许我的方法是完全错误的,但在浏览器端这应该有效,因为所有代码都在页面加载时预加载
这是基本事件管道使用节点核心模块的简单模板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
};
Run Code Online (Sandbox Code Playgroud)
//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
};
Run Code Online (Sandbox Code Playgroud)
//glue.js
var modA = require('./modA');
var modB = require('./modB');
modA.emitter.on('funcA', modB.funcB);
modA.funcA();
Run Code Online (Sandbox Code Playgroud)
node glue.js
mod@.funcA executing
modB.funcB executing
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3786 次 |
最近记录: |