Even节点和nodejs中的nexttick

时间:2016-07-01 07:59:59

标签: javascript node.js eventemitter

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

1 个答案:

答案 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');