refactor:NTEvent

This commit is contained in:
手瓜一十雪 2024-05-31 21:02:39 +08:00
parent 6248991b01
commit ae91e61304

View File

@ -14,10 +14,11 @@ export class ListenerClassBase {
} }
export class NTEventWrapper { export class NTEventWrapper {
private ListenerMap: Map<string, typeof ListenerClassBase> | undefined; private ListenerMap: Map<string, typeof ListenerClassBase> | undefined;//ListenerName-Unique -> Listener构造函数
private WrapperSession: NodeIQQNTWrapperSession | undefined; private WrapperSession: NodeIQQNTWrapperSession | undefined;//WrapperSession
private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>(); private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>(); //ListenerName-Unique -> Listener实例
private EventTask: Map<string, Internal_MapKey> = new Map<string, Internal_MapKey>(); private EventTask: Map<string, Map<string, Internal_MapKey>> = new Map<string, Map<string, Internal_MapKey>>();//tasks ListenerName -> uuid -> {timeout,createtime,func}
private ListenerInit: Map<string, boolean> = new Map<string, boolean>();
constructor() { constructor() {
} }
@ -66,18 +67,29 @@ export class NTEventWrapper {
let Listener = this.CreatListenerFunction<T>(ListenerMain, uniqueCode); //uniqueCode NTEvent let Listener = this.CreatListenerFunction<T>(ListenerMain, uniqueCode); //uniqueCode NTEvent
(Listener[ListenerMethod] as any) = cb; (Listener[ListenerMethod] as any) = cb;
} }
//初始化Listener回调
initNTListener(ListenerName: string) {
if (this.ListenerInit.get(ListenerName)) {
return;
}
this.RigisterListener(ListenerName, "NTEvent", (...args) => {
console.log('wait... DispatcherListener');
this.DispatcherListener(ListenerName, ...args).then().catch();
})
this.ListenerInit.set(ListenerName, true);
}
//统一回调清理事件 //统一回调清理事件
async DispatcherListener(...args: any[]) { async DispatcherListener(ListenerName: string, ...args: any[]) {
this.EventTask.forEach((task, uuid) => { this.EventTask.get(ListenerName)?.forEach((task, uuid) => {
if (task.createtime + task.timeout > Date.now()) { if (task.createtime + task.timeout > Date.now()) {
this.EventTask.delete(uuid); this.EventTask.get(ListenerName)?.delete(uuid);
return; return;
} }
task.func(...args); task.func(...args);
}) })
} }
async CallNoListenerEvent<EventType extends (...args: any[]) => Promise<any>,>(EventName = '', timeout: number = 3000, ...args: Parameters<EventType>) { async CallNoListenerEvent<EventType extends (...args: any[]) => Promise<any>,>(EventName = '', timeout: number = 3000, ...args: Parameters<EventType>) {
return new Promise<ReturnType<EventType>>((resolve, reject) => { return new Promise<ReturnType<EventType>>(async (resolve, reject) => {
let EventFunc = this.CreatEventFunction<EventType>(EventName); let EventFunc = this.CreatEventFunction<EventType>(EventName);
let complete = false; let complete = false;
let Timeouter = setTimeout(() => { let Timeouter = setTimeout(() => {
@ -88,10 +100,10 @@ export class NTEventWrapper {
let retData = await EventFunc!(...args); let retData = await EventFunc!(...args);
complete = true; complete = true;
resolve(retData); resolve(retData);
} });
} }
async CallNormalEvent<EventType extends (...args: any[]) => Promise<any>, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', waitTimes = 1, timeout: number = 3000, ...args: Parameters<EventType>) { async CallNormalEvent<EventType extends (...args: any[]) => Promise<any>, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', waitTimes = 1, timeout: number = 3000, ...args: Parameters<EventType>) {
return new Promise<ArrayLike<Parameters<ListenerType>>>((resolve, reject) => { return new Promise<ArrayLike<Parameters<ListenerType>>>(async (resolve, reject) => {
const id = randomUUID(); const id = randomUUID();
let complete = 0; let complete = 0;
let retData: ArrayLike<Parameters<ListenerType>> | undefined = undefined; let retData: ArrayLike<Parameters<ListenerType>> | undefined = undefined;
@ -102,9 +114,13 @@ export class NTEventWrapper {
resolve(retData as ArrayLike<Parameters<ListenerType>>); resolve(retData as ArrayLike<Parameters<ListenerType>>);
} }
} }
this.initNTListener(ListenerName);
let Timeouter = setTimeout(databack, timeout); let Timeouter = setTimeout(databack, timeout);
let ListenerNameList = ListenerName.split('/');
let ListenerMain = ListenerNameList[0];
let ListenerMethod = ListenerNameList[1];
this.EventTask.set(id, { this.EventTask.get(ListenerMain)?.set(id, {
timeout: timeout, timeout: timeout,
createtime: Date.now(), createtime: Date.now(),
func: (...args: any[]) => { func: (...args: any[]) => {
@ -134,12 +150,9 @@ export class NTEventWrapper {
// NTEvent.CreatListenerFunction<NodeIKernelMsgListener>('NodeIKernelMsgListener', 'core') // NTEvent.CreatListenerFunction<NodeIKernelMsgListener>('NodeIKernelMsgListener', 'core')
// 初步构想
// NTEventDispatch NTEvent NTEventWrapper
// 示例
// 调用接口 // 调用接口
// NTEventDispatch.CallSerice('NodeIKernelProfileLikeService/GetTest', true); let NTEvent = new NTEventWrapper();
NTEvent.CallNormalEvent<(force: boolean) => Promise<Number>, (data1: string, data2: number) => void>('NodeIKernelProfileLikeService/GetTest', 'NodeIKernelMsgListener/onAddSendMsg', 1, 3000, true);
// 注册监听 解除监听 // 注册监听 解除监听
// NTEventDispatch.RigisterListener('NodeIKernelMsgListener/onAddSendMsg','core',cb); // NTEventDispatch.RigisterListener('NodeIKernelMsgListener/onAddSendMsg','core',cb);