我正试图使用EventEmitter在两个javascript文件之间进行通信,但我很难让它双向工作。
我有服务器.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)