[NodeJs]EventEmitter

2075 ワード

イベントをトリガできるすべてのオブジェクトは、EventEmitterの例です.
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);
    }
}