Я пытаюсь разделить издателя и подписчика в файле node.js, чтобы иметь возможность отправлять данные друг другу через общий экземпляр EventEmitter в виде шины.
Моя шина следует описанному одноэлементному методу [ЗДЕСЬ] [1]
файл bus.js
// https://derickbailey.com/2016/03/09/creating-a-true-singleton-in-node-js-with-es6-symbols/
// create a unique, global symbol name
// -----------------------------------
const FOO_KEY = Symbol.for("test.exchanges.bus");
const EventEmitter = require("events");
// check if the global object has this symbol
// add it if it does not have the symbol, yet
// ------------------------------------------
var globalSymbols = Object.getOwnPropertySymbols(global);
var hasFoo = (globalSymbols.indexOf(FOO_KEY) > -1);
if (!hasFoo){
global[FOO_KEY] = {
foo: new EventEmitter()
};
}
// define the singleton API
// ------------------------
var singleton = {};
Object.defineProperty(singleton, "instance", {
get: function(){
return global[FOO_KEY];
}
});
// ensure the API is never changed
// -------------------------------
Object.freeze(singleton);
// export the singleton API only
// -----------------------------
module.exports = singleton;
Насколько я понимаю, когда мне требуется этот файл в разных модулях, один и тот же объект foo должен быть доступен.Разве это не цель иметь синглтон?
файл pub.js
const bus = require("./bus");
class Publisher {
constructor(emitter) {
this.emitter = emitter;
console.log(this.emitter);
this.test();
}
test() {
setInterval(() => {
this.emitter.emit("test", Date.now());
}, 1000);
}
}
module.exports = Publisher;
console.log(bus.instance.foo);
файл sub.js
const bus = require("./bus");
class Subscriber {
constructor(emitter) {
this.emitter = emitter;
console.log(this.emitter);
this.emitter.on("test", this.handleTest);
}
handleTest(data) {
console.log("handling test", data);
}
}
module.exports = Subscriber;
console.log(bus.instance.foo);
Когда я запускаю pub.js и sub.js в 2 отдельных окнах терминала, sub.js сразу же завершает работу, как будто издатель не отправляет ему сообщения.Кто-нибудь может указать, как разделить издателя и подписчика для работы с одной и той же шиной событий?