2016-07-01 5 views
0

私はEventemitterについて混乱しています。私はコードを書くが、それは正しく動作しません。なぜ下のコードがうまくいかないのですか:イベントジェネレータとnodejsのnexttick

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

EventEmitterが同期発する、あなたの最初の例では、イベントは(コンストラクタから)放出されることを意味する出射されます。イベントはキューに入れられていないか、または保存されていないため、イベントリスナーはメッセージを受け取ることはありません。

2番目の例では、イベントはイベントループの次のサイクルで(非同期に)コンストラクタから送出されます。その時点で、リスナーを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');