[NodeJs] EventEmitter

所有能触发事件的对象都是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);
    }
}

 

你可能感兴趣的:(nodejs,node.js)