Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';这个EventEmitter pubsub singleton接口是否在node.js中工作?_Node.js_Singleton_Publish Subscribe_Eventemitter - Fatal编程技术网

为什么不是';这个EventEmitter pubsub singleton接口是否在node.js中工作?

为什么不是';这个EventEmitter pubsub singleton接口是否在node.js中工作?,node.js,singleton,publish-subscribe,eventemitter,Node.js,Singleton,Publish Subscribe,Eventemitter,我试图在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 // ----------------------------

我试图在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;
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);
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);
我的理解是,当我在不同的模块中需要这个文件时,应该提供相同的foo对象。这不是单身的目的吗

pub.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;
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);
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);
sub.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;
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);
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时,sub.js立即执行完毕,就好像publisher没有将消息推送到它一样。有谁能指出如何将发行商和订阅者分离到同一个事件总线上工作?

< P>你可以考虑重新设计你的总线模块。我建议将其创建为扩展
EventEmitter
的类,然后返回该类的实例化实例

现在,当第一次加载此文件时,将运行类代码,并实例化一个对象,然后将其导出回
require
将缓存此实例,下次加载此文件时,它将返回相同的对象。这使它成为一个单例,您现在可以将其用作公共总线

下面是一些代码来演示这一点:

bus.js bus.spec.js