【问题标题】:javascript: require('events').EventEmitter;javascript: 要求('事件').EventEmitter;
【发布时间】:2014-02-04 16:04:41
【问题描述】:

为什么

var EventEmitter = require('events').EventEmitter;
var channel = new EventEmitter();

有效,但是

var EventEmitter = require('events');
var channel = new EventEmitter();

不工作!其实我还有一个完全不同的例子,

var Currency = require('./currency)
var Cu = new Currency();

有效,但是

var Currency = require('./currency).Currency;
var Cu = new Currency();

不起作用。这是我的 currency.js:

function Currency(canadianDollar) {
    this.canadianDollar = canadianDollar;
}

module.exports = Currency;

Currency.prototype.cal = function(amount) {
    return amount * this.canadianDollar;
}

【问题讨论】:

标签: javascript node.js eventemitter


【解决方案1】:

因为这是编写 API 的方式。 “事件”模块的简化示例如下所示:

module.exports = {
    EventEmitter: function () {
        // ...
    }
};

在上述情况下,require('events'); 将返回包含 EventEmitterObject,但 require('events').EventEmitter 将返回您可能有兴趣实例化的实际 EventEmitter 函数。

认为 API 设计人员确实可以使用 module.exports = function () { ... }; 直接导出 EventEmitter 函数会很好,但是他们决定为“事件”模块的其他可能有用的属性留出空间。

编辑

关于https://github.com/joyent/node/blob/master/lib/events.js 中的module.exports = EventEmitter;,您可以在以下几行中找到:

// Backwards-compat with node 0.10.x
EventEmitter.EventEmitter = EventEmitter;

我想从 0.11 版开始你可以运行 var Emitter = require('events');,但在 0.10.x 中你会被 require('events').EventEmitter 卡住。

【讨论】:

  • 谢谢,奥列格。但我检查了 events.js 并发现了这个:module.exports = EventEmitter;我认为构造函数是直接返回的,而不是包含构造函数的对象。
  • @Benson which node --version 你在跑吗?看看我的编辑。
  • 根据 vkurchatkin 的回答,我添加了一行 Currency.Currency = Currency;到我的currency.js。两种情况都有效。在 10.25 版本的 events.js 中,module.exports = EventEmitter; // 向后兼容节点 0.10.x EventEmitter.EventEmitter = EventEmitter;这意味着这两种情况也应该有效。但是 require('events') 仍然不起作用。
  • 不,它是 0.11.something。这里是 0.10.25 github.com/joyent/node/blob/v0.10.25-release/lib/events.js#L38
【解决方案2】:

require 准确返回您放入 module.exports 对象的内容。所以如果你有module.exports = Currency;,那么require会返回Currency,如果你有exports.Currency = Currencyrequire会返回{ Currency : Currency }对象。

如果您希望这两种方式都有效,只需执行Currency.Currency = Currency; module.exports = Currency。在最新的节点版本中,他们使用 EventEmitter

【讨论】:

  • 谢谢你,vkurchatkin。那是我的问题。在 events.js 中,module.exports = EventEmitter;但是 var EventEmitter = require('events'); var channel = new EventEmitter();不起作用。
  • 尝试最新的 0.11.x 版本
  • 当前版本为0.10.25。我没有看到任何 0.11 版本。我可以知道在哪里可以找到它吗?
猜你喜欢
  • 2012-08-22
  • 2013-08-05
  • 2019-09-11
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
相关资源
最近更新 更多