Skip to content

发布订阅

188 字小于 1 分钟

js设计模式

2024-12-28

class EventEmitter {
    constructor() {
        this.events = {};
    }

    // 订阅事件
    on(event, listener) {
        if (!this.events[event]) {
            this.events[event] = [];
        }
        this.events[event].push(listener);
    }

    // 发布事件
    emit(event, ...args) {
        if (this.events[event]) {
            this.events[event].forEach(listener => {
                listener(...args);
            });
        }
    }

    // 移除事件监听器
    off(event, listener) {
        if (this.events[event]) {
            this.events[event] = this.events[event].filter(l => l !== listener);
        }
    }

    // 只订阅一次事件
    once(event, listener) {
        const onceListener = (...args) => {
            listener(...args);
            this.off(event, onceListener);
        };
        this.on(event, onceListener);
    }
}

// 使用示例
const emitter = new EventEmitter();

// 订阅事件
emitter.on('greet', (name) => {
    console.log(`Hello, ${name}!`);
});

// 发布事件
emitter.emit('greet', 'Alice'); // 输出: Hello, Alice!

// 移除事件监听器
const listener = (name) => {
    console.log(`Goodbye, ${name}!`);
};
emitter.on('greet', listener);
emitter.off('greet', listener);

// 只订阅一次事件
emitter.once('greet', (name) => {
    console.log(`Hi, ${name}!`);
});
emitter.emit('greet', 'Bob'); // 输出: Hi, Bob!
emitter.emit('greet', 'Charlie'); // 不会输出任何内容