Node.js イベントモジュール

概要: このチュートリアルでは、Node.js のeventsモジュールとその動作について学習します。

Node.js events モジュールの紹介

Node.js はイベント駆動型です。イベント駆動型アーキテクチャを実現するために、eventsコアモジュールに依存しています。

イベント駆動型モデルでは、EventEmitterオブジェクトがイベントを発生させ、それによって事前にそのイベントにアタッチされたリスナーが実行されます。

EventEmitterオブジェクトには2つの主要な機能があります。

  • 名前付きイベントの発生。
  • 名前付きイベントに1つ以上のイベントリスナーをアタッチおよびデタッチする。

Node.jsでは、多くのコアモジュールがEventEmitterクラスを継承しています。httpモジュールなどもその例です。

次の例は、eventsモジュールの使用方法を示しています。

最初に、require()関数を使用してeventsモジュールをインクルードします。

const EventEmitter = require('events');Code language: JavaScript (javascript)

EventEmitterはクラスなので、慣例により、その名前はキャメルケースです。

次に、EventEmitterクラスの新しいインスタンスを作成します。

const emitter = new EventEmitter();Code language: JavaScript (javascript)

3つ目に、on()メソッドを使用して、イベントに1つ以上のイベントハンドラーをアタッチします。

emitter.on('saved', ) => {
    console.log(`A saved event occurred.`);
});Code language: JavaScript (javascript)

この例では、イベント名はsaved、イベントハンドラーはコールバックです。savedイベントが発生すると、コールバックが自動的に呼び出されます。

最後に、EventEmitterオブジェクトのemit()メソッドを使用してsavedイベントを発生させます。

emitter.emit('saved');Code language: JavaScript (javascript)

すべてをまとめる

const EventEmitter = require('events');

const emitter = new EventEmitter();

emitter.on('saved', () => {
    console.log(`A saved event occurred.`);
});

emitter.emit('saved');Code language: JavaScript (javascript)

出力

A saved event occurred.
Code language: JavaScript (javascript)

引数付きイベントの発生

イベントを発生させる際、イベントリスナーにデータを渡したい場合があります(例:savedイベントが発生したときに保存されたオブジェクト)。この場合、データは第2引数としてemit()メソッドに渡すことができます。例:

const EventEmitter = require('events');

const emitter = new EventEmitter();

emitter.on('saved',  (arg) => {
    console.log(`A saved event occurred: name: ${arg.name}, id: ${arg.id}`);
});

emitter.emit('saved', {
    id: 1,
    name: 'John Doe'
});Code language: JavaScript (javascript)

出力

A saved event occurred, name: John Doe, id: 1Code language: JavaScript (javascript)

この例では、savedイベントを発生させるときに、idnameの2つのプロパティを持つオブジェクトをemit()メソッドに渡します。イベントが発生すると、オブジェクトのプロパティをコンソールに表示します。

イベントリスナーのデタッチ

イベントからイベントリスナーをデタッチするには、EventEmitterオブジェクトのoff()メソッドを使用します。例:

const EventEmitter = require('events');

const emitter = new EventEmitter();

// declare the event handler
function log(arg) {
    console.log(`A saved event occurred, name: ${arg.name}, id: ${arg.id}`);
}

// attach the event listener to the saved event
emitter.on('saved', log);

// emit the saved event
emitter.emit('saved', {
    id: 1,
    name: 'John Doe'
});

// remove the event listener
emitter.off('saved', log);

// no effect
emitter.emit('saved', {
    id: 2,
    name: 'Jane Doe'
});Code language: JavaScript (javascript)

出力

A saved event occurred, name: John Doe, id: 1

この例では、イベントからイベントリスナーをデタッチした後、savedイベントが発生してもイベントリスナーは呼び出されません。

EventEmitter クラスの拡張

次の例は、EventEmitterクラスを拡張する方法を示しています。

const EventEmitter = require('events');

class Stock extends EventEmitter {
    constructor(symbol, price) {
        super();
        this._symbol = symbol;
        this._price = price;
    }
    set price(newPrice) {
        if (newPrice !== this._price) {
            this.emit('PriceChanged', {
                symbol: this._symbol,
                oldPrice: this._price,
                newPrice: newPrice,
                adjustment: ((newPrice - this._price) * 100 / this._price).toFixed(2)
            });
        }
    }
    get price() {
        return this._price;
    }
    get symbol() {
        return this._symbol;
    }
}
Code language: JavaScript (javascript)

動作方法。

  • StockクラスはEventEmitterクラスを拡張します。このクラスには、株価シンボルsymbolと価格priceの2つのプロパティがあります。
  • priceが変更されると、priceセッターはオブジェクトを使用してPriceChangedイベントを発生させます。

Stockクラスの使用方法を次に示します。

const stock = new Stock('AAPL', 700);

stock.on('PriceChanged', (arg) => {
    console.log(`The price of the stock ${arg.symbol} has changed ${arg.adjustment}%`);
})

stock.price = 720;
Code language: JavaScript (javascript)

出力

The price of the stock AAPL has changed 2.86%Code language: JavaScript (javascript)

まとめ

  • Node.js のeventsモジュールは、ノードアプリケーションでイベントを管理できるEventEmitterクラスを提供します。
  • EventEmitterオブジェクトのon()メソッドを使用して、イベントのイベントハンドラーを登録します。
  • EventEmitterオブジェクトのemit()メソッドを使用してイベントを発生させます。
このチュートリアルは役に立ちましたか?