【发布时间】:2017-05-31 05:54:35
【问题描述】:
谁能解释一下为什么下面的代码不起作用:
我有一个 EventManager 类:
const events = require('events')
class EventManager extends events.EventEmitter {
constructor() { super() }
}
const instance = new EventManager()
module.exports = instance
我有一个需要这个 EventManager 的 init.js 文件,并像这样注册一些事件:
const EventManager = require('./EventManager')
const processTask = require('./processTask')
EventManager.on('startTask', (task) => {
processTask(task)
})
EventManager.on('endTask', (task) => {
//some code
})
const someTask = {}
EventManager.emit('startTask', someTask)
在我的 processTask 函数中,我调用 EventManager 并发出 endTask 事件:
// processTask.js
const EventManager = require('../lib/EventManager')
module.exports = (task) => {
// some code
EventManager.emit('endTask')
}
但是 endTask 从不发出,为什么?
【问题讨论】:
-
永远不要从模块中导出本地类的单个实例。你为什么要继承?
-
// some code到底是什么?你有什么例外吗? -
运行您的代码并将 EventManager.emit('endTask') 放在 processTask 文件中的 setTimeout 中对我有用。我会注释掉你在那里的所有“一些代码”,然后看看它是否有效。如果是,那么它可能没有到达发出调用。
-
@Bergi,为什么导出本地类的单个实例不好?它与模块缓存有关吗?
-
不,只是对于单个实例,创建一个具有所有继承开销的类是没有意义的。如果您想导出单例,请将其设为对象文字(或者,在您的情况下,可以根据您的需要修改为
new EventEmitter)。
标签: javascript node.js ecmascript-6 eventemitter