@logicflow/engine
Version:
a process engine for javascript
94 lines • 2.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventEmitter = void 0;
class EventEmitter {
constructor() {
this._events = {};
}
/**
* 添加一个监听事件
* @param evtKey 事件名称
* @param callback 回调方法
* @param once 是否触发一次
* @returns 当前 EventEmitter 实例
*/
on(evtKey, callback, once) {
evtKey = evtKey.trim();
if (!this._events[evtKey]) {
this._events[evtKey] = [];
}
this._events[evtKey].push({
callback,
once: !!once,
});
}
/**
* 取消监听一个事件,或者一个 Channel
* @param evtKey
* @param callback
*/
off(evtKey, callback) {
if (!evtKey) {
// evtKey 为空全部清除
this._events = {};
}
if (!callback) {
// evtKey 存在,callback 为空,清除事件所有方法
delete this._events[evtKey];
}
else {
// evtKey 存在,callback 存在,清除匹配的
const events = this._events[evtKey] || [];
let { length } = events;
for (let i = 0; i < length; i++) {
if (events[i].callback === callback) {
events.splice(i, 1);
length--;
i--;
}
}
if (events.length === 0) {
delete this._events[evtKey];
}
}
}
/**
* 主动触发事件
* @param evtKey 触发事件名称
* @param eventArgs 事件参数
*/
emit(evtKey, eventArgs) {
const events = this._events[evtKey] || [];
// 实际的处理 emit 方法
const doEmit = (es) => {
let { length } = es;
for (let i = 0; i < length; i++) {
if (!es[i]) {
// eslint-disable-next-line no-continue
continue;
}
const { callback, once } = es[i];
if (once) {
es.splice(i, 1);
if (es.length === 0) {
delete this._events[evtKey];
}
length--;
i--;
}
callback.apply(this, [eventArgs]);
}
};
doEmit(events);
}
/**
* 获取当前所有事件
* @returns _events
*/
getEvents() {
return this._events;
}
}
exports.default = EventEmitter;
exports.EventEmitter = EventEmitter;
//# sourceMappingURL=EventEmitter.js.map