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');
我对 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');