我正在尝试使用 EventEmitter 在两个 javascript 文件之间进行通信,但我很难让它在两个方向上工作。
我有server.js:
let api = require('./api')
// Does not work
api.on("yo", data => {
console.log(data)
})
// Works
api.emit("ready", "Server ready")
和 api.js:
const EventEmitter = require('events')
let api = new EventEmitter()
// Works
api.on("ready", data => {
console.log(data)
})
// Does not work
api.emit("yo", "yo yo")
module.exports = api
server.js
能够向 api.js
发出事件,但反之则不行。我尝试过 module.exports 并同时要求两个文件分别存在,但这会导致错误。
如何实现这两个文件之间的双向发射/打开?
首先 api.js 被初始化,此时还没有人订阅“yo”事件。因此,您根本不应该在任何模块初始化期间发出任何事件。之后尝试以某种方式发出事件。
或者您可以将所有订阅内容移动到另一个模块中,在所有订阅完成后您可以在其中发出任何事件。
因为当我们在 server.js 顶部导入 api.js 时,我们将其内容添加到 server.js 内容之前。
因此,我们在添加事件监听器之前发出“yo”事件,如下所示:
api.emit("yo", "yo yo")
...
// this does not work
api.on("yo", data => {
console.log(data)
})
例如,如果我们按照 Anatoly 的建议等待 1 秒直到模块初始化完成。其工作原理如下:
setTimeout(() => {
// this works
api.emit("yo", "yo yo")
}, 1000)