classes_event-bus.js

/*
 * @Author liangjun
 * @LastEditors liangjun
 * @Date 2020-07-17 17:05:43
 * @LastEditTime 2023-06-05 15:45:37
 * @Description 发布与订阅
 */

/**
 * @class EventEmitter
 * @description 事件处理类
 * @example
 * const bus = new EventEmitter();
 * bus.addListener("timeout", (params) => {
 *     console.log(1);
 * });
 * bus.addListener("timeout", function two(params) {
 *     console.log(2);
 *     bus.removeListener("timeout", two);
 * });
 *
 * setInterval(() => {
 *     bus.emit("timeout", Date.now());
 * }, 1000);
 */
export class EventEmitter {
    constructor() {
        this.listeners = new Map();
    }
    /**
     * @description 订阅
     * @param {String} eventName 监听的事件名称
     * @param {Function} callback 回调函数
     */
    addListener(eventName, callback) {
        // 是否已有事件,没有进行重置为空数组
        this.listeners.has(eventName) || this.listeners.set(eventName, []);
        // 有则推进数组
        this.listeners.get(eventName).push(callback);
    }
    /**
     * @description 移除订阅
     * @param {String} eventName 取消监听的事件名称
     * @param {Function} callback 回调函数
     * @return {Boolean} 是否取消监听成功
     */
    removeListener(eventName, callback) {
        if (this.listeners.has(eventName)) {
            let eventCallbackList = this.listeners.get(eventName);
            if (eventCallbackList && eventCallbackList.length) {
                let eventCallbackListLength = eventCallbackList.length;
                for (let i = 0; i < eventCallbackListLength; i++) {
                    // 每一项对比,回调函数一致的进行删除
                    if (eventCallbackList[i] === callback) {
                        eventCallbackList.splice(i, 1);
                        return true;
                    }
                }
            } else {
                return false;
            }
        }
        return false;
    }
    /**
     * @description 发布
     * @param {String} eventName 发布的事件名称
     * @return {Boolean} 是否发布成功
     */
    emit(eventName, ...args) {
        if (this.listeners.has(eventName)) {
            const eventList = this.listeners.get(eventName);
            if (eventList && eventList.length) {
                eventList.forEach((callbackItem) => {
                    callbackItem(...args);
                });
                return true;
            } else {
                return false;
            }
        }
    }
}