我对Eventemitter感到困惑。我写了一个代码,但这不能正常工作。为什么下面的代码不起作用:
const EventEmitter = require('events');
const util = require('util');
function MyEmitter() {
EventEmitter.call(this);
this.emit('event');
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
myEmitter.on('event', function() {
console.log('an event occurred!');
});
// No output!
但下面的代码有效吗?
const EventEmitter = require('events');
const util = require('util');
function MyEmitter() {
EventEmitter.call(this);
process.nextTick(function () {
this.emit('event');
}.bind(this));
}
util.inherits(MyEmitter, EventEmitter);
const myEmitter = new MyEmitter();
myEmitter.on('event', function() {
console.log('an event occurred!');
});
输出:
an event occured!
答案 0 :(得分:1)
EventEmitter
同步发出,这意味着在第一个示例中,发出的事件(来自构造函数)是在连接侦听器之前发出的。因为事件没有排队或“保存”,所以您的事件监听器不会收到消息(它只是开始听得太晚)。
在第二个示例中,事件是在事件循环的下一个循环中从构造函数发出的(异步)。此时,将侦听器添加到myEmitter
的代码已经运行,因此在发出事件时,侦听器将接收它。
它与此类似:
// synchronously: 'A' is logged before 'B'
console.log('A');
console.log('B');
// asynchronously: 'B' is logged before 'A'
process.nextTick(function() { console.log('A') });
console.log('B');