概要: このチュートリアルでは、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イベントを発生させるときに、idとnameの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()メソッドを使用してイベントを発生させます。