yirtc-sdk-web
Version:
基于WebRTC的实时音视频SDK
106 lines (105 loc) • 2.83 kB
JavaScript
/**
* 事件发射器类
*/
export class EventEmitter {
constructor() {
this.events = new Map();
}
/**
* 注册事件监听器
* @param event 事件名称
* @param listener 监听器函数
* @returns this
*/
on(event, listener) {
if (!this.events.has(event)) {
this.events.set(event, []);
}
const listeners = this.events.get(event);
if (listeners) {
listeners.push(listener);
}
return this;
}
/**
* 注册一次性事件监听器
* @param event 事件名称
* @param listener 监听器函数
* @returns this
*/
once(event, listener) {
const onceWrapper = (...args) => {
listener(...args);
this.off(event, onceWrapper);
};
return this.on(event, onceWrapper);
}
/**
* 移除事件监听器
* @param event 事件名称
* @param listener 监听器函数
* @returns this
*/
off(event, listener) {
if (this.events.has(event)) {
const listeners = this.events.get(event);
if (listeners) {
const index = listeners.indexOf(listener);
if (index !== -1) {
listeners.splice(index, 1);
}
}
}
return this;
}
/**
* 触发事件
* @param event 事件名称
* @param args 事件参数
* @returns boolean
*/
emit(event, ...args) {
if (this.events.has(event)) {
const listeners = this.events.get(event);
if (listeners) {
// 创建副本以防止在迭代过程中修改数组
[...listeners].forEach(listener => {
try {
listener(...args);
}
catch (error) {
console.error(`事件监听器执行错误: ${event}`, error);
}
});
return true;
}
}
return false;
}
/**
* 移除所有事件监听器
* @param event 可选,指定事件名称
* @returns this
*/
removeAllListeners(event) {
if (event) {
this.events.delete(event);
}
else {
this.events.clear();
}
return this;
}
/**
* 获取事件监听器数量
* @param event 事件名称
* @returns number
*/
listenerCount(event) {
if (this.events.has(event)) {
const listeners = this.events.get(event);
return listeners ? listeners.length : 0;
}
return 0;
}
}