【问题标题】:NodeJS custom class extending EventEmitter and requireNodeJS 自定义类扩展 EventEmitter 并要求
【发布时间】: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


【解决方案1】:

这是一些代码中的问题。谢谢@Bergi 和@poeticGeek。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2016-04-29
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多