【问题标题】:Node.js: how to send events across modulesNode.js:如何跨模块发送事件
【发布时间】:2014-08-07 19:45:46
【问题描述】:

我创建了两个模块,“person”和“group”,其中“group”依赖于“person”:

person.js:

var events = require('events');

exports.Person = function() {
    var personEvents = new events.EventEmitter();

    function generateEvent(args) {
        console.log("Emitting event with args "+JSON.stringify(args));
        personEvents.emit("myEvent", args);
    }

    return {
        personEvents: personEvents,
        generateEvent: generateEvent
    };
}

group.js:

var PERSON = require("person.js").Person();
var events = require('events');

exports.Group = function() {
    function handleEvent(args) {
        console.log("Caught event with args "+JSON.stringify(args));
    }

    PERSON.personEvents.on("myEvent", function(args) {
        handleEvent(args);
    });
}

现在我将主程序 main.js 作为一个单独的模块:

var PERSON = require("person.js").Person();
var GROUP = require("group.js").Group();

PERSON.generateEvent({ type: "bla" });

当我执行“node ./main.js”时,我会看到生成了事件的消息,但是没有捕获到事件。似乎 group 模块中的侦听器未绑定到主命名空间中 person 模块中创建的相同“personEvents”变量。

我对 javascript 及其对编程的影响相当陌生。我使用我在互联网上找到的示例来获取到目前为止的代码,但我觉得这可能不是设置模块和跨模块事件的正确方法。

有人可以向我解释我应该如何设置模块,以便我可以在一个模块中生成事件并在另一个模块中捕获它们吗? 谢谢!

【问题讨论】:

  • 通常模块不会相互通信...
  • 我希望能够在一个模块中生成事件,其他模块可以监听并在需要时采取行动,从而创建松散耦合的组件。但是,如果这不是节点模块基础架构的用途,那么我想我必须重新考虑应用程序的整个设计。

标签: javascript node.js events module


【解决方案1】:

当您调用var PERSON = require("person.js").Person(); 时,会创建一个新实例。因此,当您在 group.js 中调用它时,它会创建一个单独的对象/实例,而不是您在 main.js 中调用它时创建的对象/实例。当您在 main.js 中创建 Group 时,您可以通过将 Person 对象传递给 Group 来解决此问题,例如:

group.js

var events = require('events');

exports.Group = function(PERSON) {
    function handleEvent(args) {
        console.log("Caught event with args "+JSON.stringify(args));
    }

    PERSON.personEvents.on("myEvent", function(args) {
        handleEvent(args);
    });
}

main.js

var PERSON = require("person.js").Person();
var GROUP = require("group.js").Group(PERSON);

PERSON.generateEvent({ type: "bla" });

话虽如此,这不是一个非常松散耦合的系统。如果你想要更松散耦合的东西,那么GroupPerson 根本不应该相互引用,并且它们之间的通信两个应该发生在main.js

您可以通过将group.jsmain.js 更改为类似这样的方式来实现:

group.js

var events = require('events');

exports.Group = function() {
    function handleEvent(args) {
        console.log("Caught event with args "+JSON.stringify(args));
    }
}

main.js

var PERSON = require("person.js").Person();
var GROUP = require("group.js").Group();

PERSON.on('myEvent', function(args) {
    GROUP.handleEvent(args);
});

PERSON.generateEvent({ type: "bla" });

【讨论】:

  • 感谢您的澄清!这导致我采用了另一种方法:我现在在 main.js 中为事件创建了“var messageBus = new events.EventEmitter()”,并将这个 messageBus 变量传递给 PERSON 和 GROUP 对象以进行监听/发射。
  • 很好,很高兴能帮上忙!像这样使用EventEmitter 也是一种好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
相关资源
最近更新 更多