LoginSignup
4
6

More than 5 years have passed since last update.

EventEmitter.emitの振る舞い

Posted at

イベント機構(emit -> on)を提供する EventEmitteremit / on 挙動について頭の整理&備忘の為にまとめます。
尚、ここでは、EventEmitter である process さんを利用して動作確認をしています。

単純に emit -> onした場合

emitの実行処理内で、単純にonに登録されたcallbackがコールされます。
その為、on処理中に同emitを処理したい場合などは注意が必要です。実装によっては、再帰処理になる可能性があります。

process_emit.js
process.on('msg', function(message) {
  console.log(message);
});

console.log('--- before emit msg');
process.emit('msg', 'foo');
console.log('--- after  emit msg');

// $ node process_emit.js
// --- before called emit msg
// foo
// --- after  called emit msg
// $ 

emitprocess.nextTick 又は setImmediate でラップした場合

process.nextTick 又は setImmediate でラップすると、次のTick処理で処理がなされ、前述の様な挙動を避けることが可能です。

process_emit_nextTick.js
process.on('msg', function(message) {
  console.log(message);
});

console.log('--- before called emit msg');
process.nextTick(function(){
  process.emit('msg', 'foo');
});
console.log('--- after  called emit msg');

// $ node process_emit_nextTick.js
// --- before called emit msg
// --- after  called emit msg
// foo
// $
process_emit_setImmediate.js
process.on('msg', function(message) {
  console.log(message);
});

console.log('--- before called emit msg');
setImmediate(function(){
  process.emit('msg', 'foo');
});
console.log('--- after  called emit msg');

// $ node process_emit_setImmeiate.js
// --- before called emit msg
// --- after  called emit msg
// foo
// $

尚、 process.nextTick 又は setImmediate の違いは、メインループ内での動作タイミングがの同ループ内のIO確認の「前」or「後」であることですが、詳細は、本ページの記載の際に参考にさせていただいた、以下をご参照ください(非常に勉強になりました)。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6