Node.js
イベントエミッタ
サーチ…
備考
イベントが「発生する」(「イベントの公開」または「イベントの発行」と同じ意味)、各リスナーは同期して( ソース )、 emit()
に渡された付随データどのように多くの引数を渡すか:
myDog.on('bark', (howLoud, howLong, howIntense) => { // handle the event }) myDog.emit('bark', 'loudly', '5 seconds long', 'fiercely')
リスナーは、登録された順序で呼び出されます。
myDog.on('urinate', () => console.log('My first thought was "Oh-no"')) myDog.on('urinate', () => console.log('My second thought was "Not my lawn :)"')) myDog.emit('urinate') // The console.logs will happen in the right order because they were registered in that order.
しかし、最初にprependListener()
リスナーが必要な場合は、すでに追加されている他のリスナーの前に、 prependListener()
ように使用できます。
myDog.prependListener('urinate', () => console.log('This happens before my first and second thoughts, even though it was registered after them'))
イベントを聴く必要があるが、それについて一度だけ聞きたい場合は、 on
代わりにonce
、 prependOnceListener
代わりにprependListener
使用できます。イベントが発生してリスナーが呼び出されると、リスナーは自動的に削除され、次にイベントが発生すると再び呼び出されません。
最後に、すべてのリスナーを削除してからやり直す場合は、自由に行ってください。
myDog.removeAllListeners()
イベントエミッタによるHTTPアナリティクス
HTTPサーバーコード( server.js
):
const EventEmitter = require('events')
const serverEvents = new EventEmitter()
// Set up an HTTP server
const http = require('http')
const httpServer = http.createServer((request, response) => {
// Handler the request...
// Then emit an event about what happened
serverEvents.emit('request', request.method, request.url)
});
// Expose the event emitter
module.exports = serverEvents
スーパーバイザーコード( supervisor.js
):
const server = require('./server.js')
// Since the server exported an event emitter, we can listen to it for changes:
server.on('request', (method, url) => {
console.log(`Got a request: ${method} ${url}`)
})
サーバーが要求を受け取ると、スーパーバイザがリッスンしているrequest
というイベントが発生し、スーパーバイザがそのイベントに反応します。
基本
イベントエミッタはノードに組み込まれており、 パブリッシャがイベントを発信し、 ユーザが聴いたり反応したりできるパターンである、pub-sub用です。ノード用語では、パブリッシャーはイベント・エミッターと呼ばれ、 イベントは発生し、サブスクライバーはリスナーと呼ばれ、イベントに反応します。
// Require events to start using them const EventEmitter = require('events').EventEmitter; // Dogs have events to publish, or emit class Dog extends EventEmitter {}; class Food {}; let myDog = new Dog(); // When myDog is chewing, run the following function myDog.on('chew', (item) => { if (item instanceof Food) { console.log('Good dog'); } else { console.log(`Time to buy another ${item}`); } }); myDog.emit('chew', 'shoe'); // Will result in console.log('Time to buy another shoe') const bacon = new Food(); myDog.emit('chew', bacon); // Will result in console.log('Good dog')
上記の例では、dogはパブリッシャ/ EventEmitterであり、アイテムをチェックする関数はサブスクライバ/リスナでした。より多くのリスナーを作ることもできます:
myDog.on('bark', () => { console.log('WHO\'S AT THE DOOR?'); // Panic });
1つのイベントに対して複数のリスナーが存在し、リスナーを削除することもできます。
myDog.on('chew', takeADeepBreathe); myDog.on('chew', calmDown); // Undo the previous line with the next one: myDog.removeListener('chew', calmDown);
イベントを1回だけ聴くには、以下を使用できます。
myDog.once('chew', pet);
競争条件なしで自動的にリスナーが削除されます。
購読しているイベントの名前を取得する
関数EventEmitter.eventNames()は、現在サブスクライブしているイベントの名前を含む配列を返します。
const EventEmitter = require("events");
class MyEmitter extends EventEmitter{}
var emitter = new MyEmitter();
emitter
.on("message", function(){ //listen for message event
console.log("a message was emitted!");
})
.on("message", function(){ //listen for message event
console.log("this is not the right message");
})
.on("data", function(){ //listen for data event
console.log("a data just occured!!");
});
console.log(emitter.eventNames()); //=> ["message","data"]
emitter.removeAllListeners("data");//=> removeAllListeners to data event
console.log(emitter.eventNames()); //=> ["message"]
特定のイベントを待機するために登録されたリスナーの数を取得します。
関数Emitter.listenerCount(eventName)は、引数として与えられたイベントを現在リスンしているリスナーの数を返します
const EventEmitter = require("events");
class MyEmitter extends EventEmitter{}
var emitter = new MyEmitter();
emitter
.on("data", ()=>{ // add listener for data event
console.log("data event emitter");
});
console.log(emitter.listenerCount("data")) // => 1
console.log(emitter.listenerCount("message")) // => 0
emitter.on("message", function mListener(){ //add listener for message event
console.log("message event emitted");
});
console.log(emitter.listenerCount("data")) // => 1
console.log(emitter.listenerCount("message")) // => 1
emitter.once("data", (stuff)=>{ //add another listener for data event
console.log(`Tell me my ${stuff}`);
})
console.log(emitter.listenerCount("data")) // => 2
console.log(emitter.listenerCount("message"))// => 1