![](/img/trans.png)
[英]What is the better practice for sharing variables across Node.js modules
[英]Node.js: how to send events across modules
我創建了兩個模塊“ 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”時,我會看到一條消息,說明已生成事件,但未捕獲到該事件。 似乎組模塊中的偵聽器未綁定到主命名空間中的人員模塊中創建的相同“ personEvents”變量。
我對javascript及其對編程的意義還很陌生。 我使用在互聯網上找到的示例來獲取到目前為止的代碼,但是我覺得這可能不是設置模塊和跨模塊事件的正確方法。
有人可以向我解釋如何設置模塊,以便可以在一個模塊中生成事件並在另一個模塊中捕獲事件嗎? 謝謝!
當您調用var PERSON = require("person.js").Person();
,這將創建一個新實例。 所以,當你在調用它group.js
,創建一個單獨的對象/實例時相比,你叫什么你創建一個main.js
。 在main.js
創建Person
對象時,可以通過將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" });
話雖這么說,這並不是一個松散耦合的系統。 如果您想要更松散地耦合,那么Group
和Person
根本不應該互相引用,並且兩者之間的通信應該在main.js
。
您可以通過將group.js
和main.js
更改為group.js
main.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" });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.