イベント機構(emit -> on)を提供する EventEmitter の emit / 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
// $
emitを process.nextTick 又は setImmediate でラップした場合
process.nextTick 又は setImmediate でラップすると、次のTick処理で処理がなされ、前述の様な挙動を避けることが可能です。
- process.nextTickを利用(gist)
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
// $
- setImmediateを利用(gist)
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「後」であることですが、詳細は、本ページの記載の際に参考にさせていただいた、以下をご参照ください(非常に勉強になりました)。