UNPKG

zero-dispatcher

Version:

事件,支持枚举

127 lines (126 loc) 3.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * 事件 * 事件发送者 * 修改 20220923 * 支持 异步 * 130行 * @author 蓝面包 * @copyright wc24@qq.com * @example interface events { "good": [number, string, string] } let a = new Dispatcher<events>() a.on("good", (a, b, c) => { console.log(a, b, c) }) a.emit("good", 5, "a", "ad") await a.emit("good", 5, "a", "ad") */ class ZeroDispatcher { constructor(target) { this.target = target; this.pool = {}; } /** * 注册事件 * @param type * @param callBack 事件处理函数 */ on(type, callback, target = null) { let callbacks = this.pool[type]; if (callbacks == null) { callbacks = []; this.pool[type] = callbacks; } callbacks.push({ callback: callback, target: target || this.target || this }); } /** * 注册一次性事件事件 * @param type * @param callBack 事件处理函数 */ once(type, callback, target = null) { let callbacks = this.pool[type]; if (callbacks == null) { callbacks = []; this.pool[type] = callbacks; } let _callback = (...arg) => { callback(...arg); this.off(type, _callback); }; callbacks.push({ callback: _callback, target: target || this.target || this }); } /** * 通知事件 * @param event */ emit(type, ...arg) { let callbacks = this.pool[type]; if (callbacks != null) { let backs; for (let index = 0; index < callbacks.length; index++) { const element = callbacks[index]; let back = element.callback.apply(element.target, arg); if (back != null && Promise instanceof back) { if (backs == null) { backs = []; } backs.push(back); } } if (backs != null) { return Promise.all(backs); } } } /** * 注销事件 * @param type * @param callBack 事件处理函数 */ off(type, callback) { let callbacks = this.pool[type]; if (callbacks != null) { for (let index = 0; index < callbacks.length; index++) { const element = callbacks[index]; if (element.callback == callback) { callbacks.splice(index, 1); break; } } } } has(type, callback) { if (callback == null) { return this.pool[type] != null; } else { let callbacks = this.pool[type]; if (callbacks != null) { for (let index = 0; index < callbacks.length; index++) { const element = callbacks[index]; if (element.callback == callback) { return true; } } return false; } else { return false; } } } /** * 删掉所有事件 */ clear() { this.pool = {}; } } exports.default = ZeroDispatcher;