[NodeJs]EventEmitter
イベントをトリガできるすべてのオブジェクトは、EventEmitterの例です.
あるイベントに結びつけられたすべての関数は同期されて呼び出されるので、イベント応答関数の中には時間がかかります.
そのためには、この部分の時間の経過を監視する必要があります.
実際の開発では、このイベントのすべてのコールバック関数の戻り値を取得する必要があるシーンがよくあります.
戻り値にfalseがあるかどうかによって、下のコード論理が実行されます.
import { EventEmitter } from 'events';
const myEventEmitter = new EventEmitter();
1.emitトリガイベントの場合、パラメータを関数として許可します.const proxyEventEmitter = new Proxy(myEventEmitter, {
get: function(target, property) {
if (property !== 'emit') {
return target[property];
}
if (property in target) {
return proxyEmit(target, property);
}
}
})
function proxyEmit(target, property) {
return (eventName, ...args) => {
const params = args.map(param => isFunction(param) ? param() : param);
const result = target[property](eventName, ...params);
return result;
}
}
2.emitトリガの統計時間あるイベントに結びつけられたすべての関数は同期されて呼び出されるので、イベント応答関数の中には時間がかかります.
そのためには、この部分の時間の経過を監視する必要があります.
function proxyEmit(target, property) {
return (eventName, ...args) => {
const params = args.map(param => isFunction(param) ? param() : param);
const startTime = +new Data();
const result = target[property](eventName, ...params);
const endTime = +new Data();
const time = endTime - startTime;
if (time > 200) {
console.error(`${eventName} :${time}ms`);
}
return result;
}
}
3.emitコールバック関数の統計結果実際の開発では、このイベントのすべてのコールバック関数の戻り値を取得する必要があるシーンがよくあります.
戻り値にfalseがあるかどうかによって、下のコード論理が実行されます.
function proxyEmit(target, property) {
return (eventName, ...args) => {
const params = args.map(param => isFunction(param) ? param() : param);
const listeners = myEventEmitter.rawListeners(eventName);
const startTime = +new Data();
const results = map(listeners, fn => {
return fn(params);
});
const endTime = +new Data();
const time = endTime - startTime;
if (time > 200) {
console.error(`${eventName} :${time}ms`);
}
return Promise.all(results);
}
}