イベントループ
イベントループを用いてよりNode.jsらしいプログラムを書いていきます。
イベントの登録と発火
eventモジュールを使用します。
const events = require('events');
var emitter = new events.EventEmitter();
emitter.on('myevent',function () {
console.log('my event emitted');
});
emitter.emit('myevent');
コードの解説をします。
まずはモジュールを使用する宣言をします。
const events = require('events');
次にイベントの登録をします。
javascriptのaddEventListenerに相当するものがこのEventEmitterです。
var emitter = new events.EventEmitter();
そしてそのイベントのインスタンスにインスタンス.on('イベント名', コールバック)
で実装をします。
emitter.on('myevent',function () {
最後にインスタンス.emit('イベント名')
でイベントを発火します。
emitter.emit('myevent');
しかしこのままでは非同期プログラミングになりません。
先ほどのスクリプトの末尾にconsole.log()で何か出力してみましょう。
const events = require('events');
var emitter = new events.EventEmitter();
emitter.on('myevent',function () {
console.log('my event emitted');
});
emitter.emit('myevent');
console.log('non-blocking');
非同期なものならこのように出力されるはずです。
non-blocking
my event emitted
しかしこのスクリプトを実行すると
my event emitted
non-blocking
となってしまいます。
process.nextTick()を使用する
非同期な処理を書くにはprocess.nextTick()
を使用します。
先ほどのスクリプトを以下のように修正してみましょう。
const events = require('events');
var emitter = new events.EventEmitter();
emitter.on('myevent',function () {
process.nextTick(function () {
console.log('my event emitted');
});
});
emitter.emit('myevent');
console.log('non-blocking');
実行してみましょう。以下のように出力されるはずです。
non-blocking
my event emitted
これで非同期処理が書けるようになりました!
Node.jsはイベントループが回ってますが、コールバックなどを呼ぶとそのループを停止して処理を実行します。
process.nextTick()
は次のループ内で実行するようにする事ができるようになり、非同期な処理を書く事ができます。