javascript - nodejs 的 pubsub 设计模式

标签 javascript node.js design-patterns

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

我想拥有以下能力:

模块 A 发布事件“X” 模块 B 在不知道模块 A 的情况下订阅事件“X”(除了可能发送的参数)

我测试了这个简单的实现 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');
});

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

最佳答案

这是一个使用 Node 的核心 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

关于javascript - nodejs 的 pubsub 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18217444/

相关文章:

javascript - 没有背景图像的视差 div

javascript - 更改 backgroundImage 属性时遇到问题

javascript - 将数据从 php 传递到 javascript 以用于混合应用程序

javascript - 无法通过 bash 使用 phantomjs 打开 javascript 文件

node.js - 将 Alexa SDK 模块安装到本地 Node 环境有什么意义?

java - 如何搭建仿真架构,OO设计

javascript - 使用 Google 跟踪代码管理器在域之间传递变量值

javascript - 如何在 svg 上粘贴 svg

c# - 使用Strategy Design Pattern(C#)对不同列的数据进行排序

python - 有没有一种简单、优雅的方式来定义单例?