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

Node.js EventEmitter events no longer triggered on node 12.1+

我已将问题剥离回以下代码:

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 此代码输出:

Hello
World

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

Hello

看来监听器在更高版本的 Node 中不再起作用。

这是模块的一部分,是导出的/必需的,所以我试图让听众远离模块的实例。

任何人都可以解释为什么它停止工作,以及推荐的方法是什么。

您不能像现在这样在原型上放置 .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.

的两个版本