zz-chart
Version:
Alauda Chart components by Alauda Frontend Team
101 lines • 2.86 kB
JavaScript
const WILDCARD = '*';
/* event-emitter */
export default class EventEmitter {
constructor() {
this._events = {};
}
/**
* 监听一个事件
* @param evt
* @param callback
* @param once
*/
// type-coverage:ignore-next-line
on(evt, callback, once) {
if (!this._events[evt]) {
this._events[evt] = [];
}
this._events[evt].push({
callback,
once: !!once,
});
return this;
}
/**
* 监听一个事件一次
* @param evt
* @param callback
*/
once(evt, callback) {
return this.on(evt, callback, true);
}
/**
* 触发一个事件
* @param evt
* @param args
*/
emit(evt, ...args) {
const events = this._events[evt] || [];
const wildcardEvents = this._events[WILDCARD] || [];
// 实际的处理 emit 方法
const doEmit = (es) => {
let length = es.length;
for (let i = 0; i < length; i++) {
if (!es[i]) {
continue;
}
const { callback, once } = es[i];
if (once) {
es.splice(i, 1);
if (es.length === 0) {
delete this._events[evt];
}
length--;
// eslint-disable-next-line sonar/updated-loop-counter
i--;
}
callback.apply(this, args);
}
};
doEmit(events);
doEmit(wildcardEvents);
}
/**
* 取消监听一个事件,或者一个 channel
*/
// eslint-disable-next-line sonarjs/cognitive-complexity
off(evt, callback) {
if (!evt) {
// evt 为空全部清除
this._events = {};
}
else {
if (!callback) {
// evt 存在,callback 为空,清除事件所有方法
delete this._events[evt];
}
else {
// evt 存在,callback 存在,清除匹配的
const events = this._events[evt] || [];
let length = events.length;
for (let i = 0; i < length; i++) {
if (events[i].callback === callback) {
events.splice(i, 1);
length--;
// eslint-disable-next-line sonar/updated-loop-counter
i--;
}
}
if (events.length === 0) {
delete this._events[evt];
}
}
}
return this;
}
/* 当前所有的事件 */
getEvents() {
return this._events;
}
}
//# sourceMappingURL=event-emitter.js.map