节点12.1+上不再触发Node.js EventEmitter事件

时间:2015-05-01 18:09:39

标签: node.js events javascript-events eventemitter

我已将问题解决回以下代码:



var EventEmitter = require("events").EventEmitter,
  util = require('util');

function Foo() {
  EventEmitter.call(this);
}
util.inherits(Foo, EventEmitter);

Foo.prototype.on('hello', function() {
  console.log("World");
});

Foo.prototype.start = function() {
  console.log('Hello');
  this.emit('hello');
}

var foo = new Foo();
foo.start();




使用Node v0.10.36,此代码输出:

您好 世界

但是使用Node v0.12.1代码输出:

您好

似乎侦听器不再在更高版本的Node中运行。

这是导出/需要的模块的一部分,因此我试图让侦听器远离模块的实例。

任何人都可以解释为什么停止工作,建议的方法是什么。

1 个答案:

答案 0 :(得分:2)

您无法像原先那样在原型上放置.on()处理程序。您对象的EventEmitter部分甚至不知道它,并且没有向EventEmitter基础对象注册事件处理程序。

相反,您需要在实例化对象后安装事件处理程序,以便EventEmitter有机会实际注册事件处理程序。

var EventEmitter = require("events").EventEmitter,
  util = require('util');

function Foo() {
  EventEmitter.call(this);
  this.on('hello', function() {
    console.log("World");
  });
}
util.inherits(Foo, EventEmitter);

Foo.prototype.start = function() {
  console.log('Hello');
  this.emit('hello');
}

var foo = new Foo();
foo.start();

仅供参考,我在自己的计算机上在节点v0.12.2上测试了这个脚本并生成了输出:

Hello
World

就个人而言,我不知道它是如何在之前版本的node.js上运行的,因为你的代码根本就没有注册任何事件处理程序。因此,我无法解释您问题的这一部分,但此代码建议适用于node.js的两个版本。