zero-dispatcher
Version:
事件,支持枚举
127 lines (126 loc) • 3.37 kB
JavaScript
;
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;