Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

EventEmitter.emitの振る舞い

More than 5 years have passed since last update.

イベント機構(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「後」であることですが、詳細は、本ページの記載の際に参考にさせていただいた、以下をご参照ください(非常に勉強になりました)。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away