nodejs 中的 Eventemitter 和 nexttick

Eventemitter and nexttick in nodejs

我对 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!

EventEmitter 同步发出,这意味着在您的第一个示例中,正在发出的事件(从构造函数)在附加侦听器之前发出。由于事件未排队或 "saved",您的事件侦听器不会收到消息(它开始侦听的时间太晚了)。

在您的第二个示例中,事件是在事件循环的下一个周期(异步)中从构造函数发出的。那时,将侦听器添加到 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');