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.
的两个版本
我已将问题剥离回以下代码:
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.
的两个版本