UNPKG

awesome-im

Version:

Lightweight, extensible, JavaScript Instant Messaging.

80 lines 2.25 kB
class EventEmitter { constructor() { this._map = {}; } /** * 添加事件监听器 * @param eventType * @param listener */ on(eventType, listener, target) { const arr = this._map[eventType] || (this._map[eventType] = []); if (arr.some((item) => item.listener === listener && item.target === target)) { return; } arr.push({ listener, target }); } once(eventType, listener, target) { const arr = this._map[eventType] || (this._map[eventType] = []); if (arr.some((item) => item.listener === listener && item.target === target)) { return; } arr.push({ listener, target, once: true }); } /** * 移除事件监听器 * @param eventType * @param listener */ off(eventType, listener, target) { let arr = this._map[eventType]; if (!arr) { return; } arr = arr.filter((item) => item.listener !== listener || item.target !== target); if (arr.length) { this._map[eventType] = arr; } else { delete this._map[eventType]; } } /** * 事件派发 * @param eventType * @param attrs */ emit(eventType, ...attrs) { const arr = this._map[eventType]; if (!arr) { return; } for (let i = arr.length - 1; i >= 0; i -= 1) { const { target, once, listener } = arr[i]; if (once) arr.splice(i, 1); try { listener.call(target, ...attrs); } catch (error) { // logger_1.engineLogger.error(error); } } } /** * 清空所有指定类型的事件监听器 * @param eventType */ removeAll(eventType) { delete this._map[eventType]; } /** * 无差别清空所有事件监听器 */ clear() { Object.keys(this._map).forEach(this.removeAll, this); } } export const eventEmitter = new EventEmitter(); export default EventEmitter; //# sourceMappingURL=EventEmitter.js.map