UNPKG

@logicflow/engine

Version:

a process engine for javascript

104 lines (96 loc) 2.43 kB
export interface EventType { readonly callback: (params?: any) => void readonly once: boolean } export type EventArgs = Record<string, unknown> export type EventsType = Record<string, EventType[]> export type CallbackType = (...args: unknown[]) => void export default class EventEmitter { private _events: EventsType constructor() { this._events = {} } /** * 添加一个监听事件 * @param evtKey 事件名称 * @param callback 回调方法 * @param once 是否触发一次 * @returns 当前 EventEmitter 实例 */ on(evtKey: string, callback: CallbackType, once?: boolean) { evtKey = evtKey.trim() if (!this._events[evtKey]) { this._events[evtKey] = [] } this._events[evtKey].push({ callback, once: !!once, }) } /** * 取消监听一个事件,或者一个 Channel * @param evtKey * @param callback */ off(evtKey: string, callback?: CallbackType) { 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: string, eventArgs: 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 } } export { EventEmitter }