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