【问题标题】:Eventemitter and nexttick in nodejsnodejs中的Eventemitter和nexttick
【发布时间】:2016-11-03 13:16:24
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js eventemitter


    【解决方案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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-11
      • 2015-10-19
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      相关资源
      最近更新 更多