From ae91e61304e5178cfc6bb33e1395dfffd59b903f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=89=8B=E7=93=9C=E4=B8=80=E5=8D=81=E9=9B=AA?= Date: Fri, 31 May 2024 21:02:39 +0800 Subject: [PATCH] refactor:NTEvent --- src/common/utils/EventTask.ts | 47 ++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 17 deletions(-) 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 | undefined; - private WrapperSession: NodeIQQNTWrapperSession | undefined; - private ListenerManger: Map = new Map(); - private EventTask: Map = new Map(); + private ListenerMap: Map | undefined;//ListenerName-Unique -> Listener构造函数 + private WrapperSession: NodeIQQNTWrapperSession | undefined;//WrapperSession + private ListenerManger: Map = new Map(); //ListenerName-Unique -> Listener实例 + private EventTask: Map> = new Map>();//tasks ListenerName -> uuid -> {timeout,createtime,func} + private ListenerInit: Map = new Map(); constructor() { } @@ -66,18 +67,29 @@ export class NTEventWrapper { let Listener = this.CreatListenerFunction(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 Promise,>(EventName = '', timeout: number = 3000, ...args: Parameters) { - return new Promise>((resolve, reject) => { + return new Promise>(async (resolve, reject) => { let EventFunc = this.CreatEventFunction(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 Promise, ListenerType extends (...args: any[]) => void>(EventName = '', ListenerName = '', waitTimes = 1, timeout: number = 3000, ...args: Parameters) { - return new Promise>>((resolve, reject) => { + return new Promise>>(async (resolve, reject) => { const id = randomUUID(); let complete = 0; let retData: ArrayLike> | undefined = undefined; @@ -102,9 +114,13 @@ export class NTEventWrapper { resolve(retData as ArrayLike>); } } + 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>('NodeIKernelProfileLikeService/GetTest'); // if (TestEvent) { // TestEvent(true); @@ -134,12 +150,9 @@ export class NTEventWrapper { // NTEvent.CreatListenerFunction('NodeIKernelMsgListener', 'core') -// 初步构想 -// NTEventDispatch NTEvent NTEventWrapper -// 示例 - // 调用接口 -// NTEventDispatch.CallSerice('NodeIKernelProfileLikeService/GetTest', true); +let NTEvent = new NTEventWrapper(); +NTEvent.CallNormalEvent<(force: boolean) => Promise, (data1: string, data2: number) => void>('NodeIKernelProfileLikeService/GetTest', 'NodeIKernelMsgListener/onAddSendMsg', 1, 3000, true); // 注册监听 解除监听 // NTEventDispatch.RigisterListener('NodeIKernelMsgListener/onAddSendMsg','core',cb);