Event Emitter
Event Emitterは同期的に実行される
同期的に実行される理由は、Eventの適切な順序付けを確実にし競合状態や論理エラーを避けるため
setImmediateやprocess.nextTickを使うことで非同期に切り替えることもできる
code:event_emitter.ts
const EventEmitter = require("events");
class MyEvent extends EventEmitter {}
const myEvent = new MyEvent();
// regist event
myEvent.on("event", (count: number) => {
console.log(count: ${count});
});
myEvent.once("event", (count: number) => {
console.log("This event is emitted only once");
});
myEvent.emit("event", 1);
// > count: 1
// > This event is emitted only once
myEvent.emit("event", 2);
// > count: 2
function helloEmit() {
const eventEmitter = new EventEmitter();
setTimeout(() => eventEmitter.emit("hello", "hello world"), 100);
return eventEmitter;
}
helloEmit().on("hello", (hello) => console.log(hello))
callbackとの使い分け
callback
単に非同期を実現したいだけの時
成功と失敗で処理が別れる時
複数のイベントを扱うのに向いていない
発生回数が一度だけの時
EventEmitter
何が起こったのかを伝える必要がある時
複数のイベントが発生する時
同じイベントが複数回発生する時
発生回数が予測できない時
参考