イベントループ

イベントループを用いてより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()は次のループ内で実行するようにする事ができるようになり、非同期な処理を書く事ができます。

results matching ""

    No results matching ""