diff --git a/src/common/utils/EventTask.ts b/src/common/utils/EventTask.ts index ab348db6..b638026b 100644 --- a/src/common/utils/EventTask.ts +++ b/src/common/utils/EventTask.ts @@ -14,10 +14,11 @@ export class ListenerClassBase { } export class NTEventWrapper { - private ListenerMap: Map<string, typeof ListenerClassBase> | undefined; - private WrapperSession: NodeIQQNTWrapperSession | undefined; - private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>(); - private EventTask: Map<string, Internal_MapKey> = new Map<string, Internal_MapKey>(); + private ListenerMap: Map<string, typeof ListenerClassBase> | undefined;//ListenerName-Unique -> Listener构造函数 + private WrapperSession: NodeIQQNTWrapperSession | undefined;//WrapperSession + private ListenerManger: Map<string, ListenerClassBase> = new Map<string, ListenerClassBase>(); //ListenerName-Unique -> Listener实例 + 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() { } @@ -66,18 +67,29 @@ export class NTEventWrapper { let Listener = this.CreatListenerFunction<T>(ListenerMain, uniqueCode); //uniqueCode NTEvent (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[]) { - this.EventTask.forEach((task, uuid) => { + async DispatcherListener(ListenerName: string, ...args: any[]) { + this.EventTask.get(ListenerName)?.forEach((task, uuid) => { if (task.createtime + task.timeout > Date.now()) { - this.EventTask.delete(uuid); + this.EventTask.get(ListenerName)?.delete(uuid); return; } task.func(...args); }) } 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 complete = false; let Timeouter = setTimeout(() => { @@ -88,10 +100,10 @@ export class NTEventWrapper { let retData = await EventFunc!(...args); complete = true; 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>) { - return new Promise<ArrayLike<Parameters<ListenerType>>>((resolve, reject) => { + return new Promise<ArrayLike<Parameters<ListenerType>>>(async (resolve, reject) => { const id = randomUUID(); let complete = 0; let retData: ArrayLike<Parameters<ListenerType>> | undefined = undefined; @@ -102,9 +114,13 @@ export class NTEventWrapper { resolve(retData as ArrayLike<Parameters<ListenerType>>); } } + this.initNTListener(ListenerName); 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, createtime: Date.now(), func: (...args: any[]) => { @@ -123,7 +139,7 @@ export class NTEventWrapper { } // 示例代码 快速创建事件 -// let NTEvent = new NTEventWrapper(); +//let NTEvent = new NTEventWrapper(); // let TestEvent = NTEvent.CreatEventFunction<(force: boolean) => Promise<Number>>('NodeIKernelProfileLikeService/GetTest'); // if (TestEvent) { // TestEvent(true); @@ -134,12 +150,9 @@ export class NTEventWrapper { // 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);