awesome-im
Version:
Lightweight, extensible, JavaScript Instant Messaging.
80 lines • 2.25 kB
JavaScript
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