@kkarum/framework 2.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/Framework.ts +337 -0
  2. package/Framework.ts.meta +10 -0
  3. package/FrameworkBase.ts +207 -0
  4. package/FrameworkBase.ts.meta +10 -0
  5. package/FrameworkInitialize.ts +79 -0
  6. package/FrameworkInitialize.ts.meta +10 -0
  7. package/README.md +93 -0
  8. package/README.md.meta +6 -0
  9. package/animation/FWAnimation.ts +13 -0
  10. package/animation/FWAnimation.ts.meta +10 -0
  11. package/animation/FWSkeleton.ts +174 -0
  12. package/animation/FWSkeleton.ts.meta +10 -0
  13. package/animation/FWTween.ts +60 -0
  14. package/animation/FWTween.ts.meta +10 -0
  15. package/animation.meta +13 -0
  16. package/component/FWVirtuaScrollViewComponent.ts +56 -0
  17. package/component/FWVirtuaScrollViewComponent.ts.meta +10 -0
  18. package/component/FWVirtualViewComponent.ts +2212 -0
  19. package/component/FWVirtualViewComponent.ts.meta +10 -0
  20. package/component.meta +13 -0
  21. package/config/FWAssetConfig.ts +7 -0
  22. package/config/FWAssetConfig.ts.meta +10 -0
  23. package/config/FWSystemConfig.ts +29 -0
  24. package/config/FWSystemConfig.ts.meta +10 -0
  25. package/config.meta +13 -0
  26. package/controller/FWLayerController.ts +178 -0
  27. package/controller/FWLayerController.ts.meta +10 -0
  28. package/controller.meta +13 -0
  29. package/data/FWData.ts +6 -0
  30. package/data/FWData.ts.meta +10 -0
  31. package/data.meta +13 -0
  32. package/define/FWEventDefine.ts +28 -0
  33. package/define/FWEventDefine.ts.meta +10 -0
  34. package/define/FWSystemDefine.ts +154 -0
  35. package/define/FWSystemDefine.ts.meta +10 -0
  36. package/define.meta +13 -0
  37. package/entry/FWEntry.ts +219 -0
  38. package/entry/FWEntry.ts.meta +10 -0
  39. package/entry.meta +13 -0
  40. package/expand/FWCocosExpand.ts +73 -0
  41. package/expand/FWCocosExpand.ts.meta +10 -0
  42. package/expand/FWDecorator.ts +366 -0
  43. package/expand/FWDecorator.ts.meta +10 -0
  44. package/expand/FWNodeExpand.ts +147 -0
  45. package/expand/FWNodeExpand.ts.meta +10 -0
  46. package/expand/FWRollingViewNesting.ts +195 -0
  47. package/expand/FWRollingViewNesting.ts.meta +10 -0
  48. package/expand/FWTweenExpand.ts +44 -0
  49. package/expand/FWTweenExpand.ts.meta +10 -0
  50. package/expand.meta +13 -0
  51. package/item/FWVirtualListItem.ts +141 -0
  52. package/item/FWVirtualListItem.ts.meta +10 -0
  53. package/item.meta +13 -0
  54. package/language/FWLanguage.ts +71 -0
  55. package/language/FWLanguage.ts.meta +10 -0
  56. package/language/FWLanguageLabelLocalize.ts +144 -0
  57. package/language/FWLanguageLabelLocalize.ts.meta +10 -0
  58. package/language/FWLanguageSkeletonLocalize.ts +106 -0
  59. package/language/FWLanguageSkeletonLocalize.ts.meta +10 -0
  60. package/language/FWLanguageSpriteLocalize.ts +81 -0
  61. package/language/FWLanguageSpriteLocalize.ts.meta +10 -0
  62. package/language.meta +13 -0
  63. package/layer/FWLayer.ts +14 -0
  64. package/layer/FWLayer.ts.meta +10 -0
  65. package/layer.meta +13 -0
  66. package/log/FWLog.ts +135 -0
  67. package/log/FWLog.ts.meta +10 -0
  68. package/log.meta +13 -0
  69. package/logic/FWLogic.ts +6 -0
  70. package/logic/FWLogic.ts.meta +10 -0
  71. package/logic.meta +13 -0
  72. package/machine/FWAnimationMachine.ts +28 -0
  73. package/machine/FWAnimationMachine.ts.meta +10 -0
  74. package/machine/FWStateMachine.ts +74 -0
  75. package/machine/FWStateMachine.ts.meta +10 -0
  76. package/machine.meta +13 -0
  77. package/manager/FWAnimationManager.ts +89 -0
  78. package/manager/FWAnimationManager.ts.meta +10 -0
  79. package/manager/FWAssetManager.ts +451 -0
  80. package/manager/FWAssetManager.ts.meta +10 -0
  81. package/manager/FWAudioManager.ts +339 -0
  82. package/manager/FWAudioManager.ts.meta +10 -0
  83. package/manager/FWBundleManager.ts +97 -0
  84. package/manager/FWBundleManager.ts.meta +10 -0
  85. package/manager/FWComponentManager.ts +24 -0
  86. package/manager/FWComponentManager.ts.meta +10 -0
  87. package/manager/FWEngineManager.ts +74 -0
  88. package/manager/FWEngineManager.ts.meta +10 -0
  89. package/manager/FWEventManager.ts +361 -0
  90. package/manager/FWEventManager.ts.meta +10 -0
  91. package/manager/FWHotUpdateManager.ts +344 -0
  92. package/manager/FWHotUpdateManager.ts.meta +10 -0
  93. package/manager/FWLanguageManager.ts +114 -0
  94. package/manager/FWLanguageManager.ts.meta +10 -0
  95. package/manager/FWLayerManager.ts +862 -0
  96. package/manager/FWLayerManager.ts.meta +10 -0
  97. package/manager/FWManager.ts +9 -0
  98. package/manager/FWManager.ts.meta +10 -0
  99. package/manager/FWObjectManager.ts +161 -0
  100. package/manager/FWObjectManager.ts.meta +10 -0
  101. package/manager/FWPerformanceManager.ts +198 -0
  102. package/manager/FWPerformanceManager.ts.meta +10 -0
  103. package/manager/FWPromiseManager.ts +504 -0
  104. package/manager/FWPromiseManager.ts.meta +10 -0
  105. package/manager/FWResManager.ts +299 -0
  106. package/manager/FWResManager.ts.meta +10 -0
  107. package/manager/FWSocketManager.ts +93 -0
  108. package/manager/FWSocketManager.ts.meta +10 -0
  109. package/manager/FWStateManager.ts +100 -0
  110. package/manager/FWStateManager.ts.meta +10 -0
  111. package/manager/FWTaskManager.ts +41 -0
  112. package/manager/FWTaskManager.ts.meta +10 -0
  113. package/manager/FWTimeManager.ts +442 -0
  114. package/manager/FWTimeManager.ts.meta +10 -0
  115. package/manager/FWUiManager.ts +217 -0
  116. package/manager/FWUiManager.ts.meta +10 -0
  117. package/manager.meta +13 -0
  118. package/package.json +11 -0
  119. package/package.json.meta +6 -0
  120. package/registry/FWRegistry.ts +62 -0
  121. package/registry/FWRegistry.ts.meta +10 -0
  122. package/registry.meta +13 -0
  123. package/render/FWRenderAssembler.ts +620 -0
  124. package/render/FWRenderAssembler.ts.meta +10 -0
  125. package/render.meta +13 -0
  126. package/scene/FWScene.ts +23 -0
  127. package/scene/FWScene.ts.meta +10 -0
  128. package/scene.meta +13 -0
  129. package/service/FWService.ts +11 -0
  130. package/service/FWService.ts.meta +10 -0
  131. package/service/http/FWHttp.ts +103 -0
  132. package/service/http/FWHttp.ts.meta +10 -0
  133. package/service/http.meta +13 -0
  134. package/service/socket/FWSocket.ts +367 -0
  135. package/service/socket/FWSocket.ts.meta +10 -0
  136. package/service/socket/FWSocketHandle.ts +16 -0
  137. package/service/socket/FWSocketHandle.ts.meta +10 -0
  138. package/service/socket/FWSocketSender.ts +14 -0
  139. package/service/socket/FWSocketSender.ts.meta +10 -0
  140. package/service/socket/mock/FWSocketMock.ts +202 -0
  141. package/service/socket/mock/FWSocketMock.ts.meta +10 -0
  142. package/service/socket/mock.meta +13 -0
  143. package/service/socket.meta +13 -0
  144. package/service.meta +13 -0
  145. package/state/FWState.ts +8 -0
  146. package/state/FWState.ts.meta +10 -0
  147. package/state.meta +13 -0
  148. package/types/Creator.d.ts +121 -0
  149. package/types/Creator.d.ts.meta +6 -0
  150. package/types/FW.d.ts +3016 -0
  151. package/types/FW.d.ts.meta +6 -0
  152. package/types/Global.d.ts +22 -0
  153. package/types/Global.d.ts.meta +10 -0
  154. package/types.meta +13 -0
  155. package/utils/FWLodash.ts +105 -0
  156. package/utils/FWLodash.ts.meta +10 -0
  157. package/utils/FWMask.ts +222 -0
  158. package/utils/FWMask.ts.meta +10 -0
  159. package/utils/FWObject.ts +27 -0
  160. package/utils/FWObject.ts.meta +10 -0
  161. package/utils/FWObjectPool.ts +177 -0
  162. package/utils/FWObjectPool.ts.meta +10 -0
  163. package/utils/FWQueue.ts +55 -0
  164. package/utils/FWQueue.ts.meta +10 -0
  165. package/utils/FWResLoader.ts +139 -0
  166. package/utils/FWResLoader.ts.meta +10 -0
  167. package/utils/FWTask.ts +227 -0
  168. package/utils/FWTask.ts.meta +10 -0
  169. package/utils/FWUtils.ts +15 -0
  170. package/utils/FWUtils.ts.meta +10 -0
  171. package/utils.meta +13 -0
@@ -0,0 +1,504 @@
1
+ import { FWManager } from "./FWManager";
2
+
3
+ export default class FWPromiseManager
4
+ extends FWManager
5
+ implements FW.PromiseManager
6
+ {
7
+ private promiseRegistry: Map<number, FW.PromiseProxy<any>>;
8
+ private uniqueId: number = 0;
9
+
10
+ public initialize(): void {
11
+ this.promiseRegistry = new Map<number, FW.PromiseProxy<any>>();
12
+ }
13
+
14
+ public onDestroy(): void {
15
+ this.cancelAll();
16
+ this.promiseRegistry.clear();
17
+ }
18
+
19
+ public execute<T = any>(
20
+ executor: FW.PromiseExcutor<T>,
21
+ options: FW.PromiseExecuteOptions = {},
22
+ ): FW.PromiseProxy<T> {
23
+ const id = this.uniqueId++;
24
+ const maxRetryTimes = options.retryCount || 0;
25
+ const retryInterval = options.retryInterval || 0;
26
+ let retryCount = 0;
27
+ let timerSchedule: FW.TimerSchedule;
28
+ let cancelResolve: (() => void) | null = null;
29
+ let isCancelled = false;
30
+ let abortListeners: Array<(this: any, ev: Event) => any> = [];
31
+
32
+ const createPromise = (): Promise<T> => {
33
+ return new Promise<T>((resolve, reject) => {
34
+ let cancelPromiseResolve: (() => void) | null = null;
35
+ const cancelPromise = new Promise<never>((resolve, reject) => {
36
+ cancelResolve = () => {
37
+ isCancelled = true;
38
+ if (cancelPromiseResolve) {
39
+ cancelPromiseResolve();
40
+ } else {
41
+ FW.Entry.timeMgr.scheduleOnce(() => {
42
+ if (cancelPromiseResolve) cancelPromiseResolve();
43
+ });
44
+ }
45
+ };
46
+ }).then(() => {
47
+ return new Promise<never>(() => {});
48
+ });
49
+
50
+ const mainPromise = new Promise<T>((innerResolve, innerReject) => {
51
+ try {
52
+ const signal = {
53
+ aborted: isCancelled,
54
+ onabort: null as ((this: any, ev: Event) => any) | null,
55
+ addEventListener: (
56
+ type: string,
57
+ listener: (this: any, ev: Event) => any,
58
+ ) => {
59
+ if (type === "abort") {
60
+ signal.onabort = listener;
61
+ }
62
+ },
63
+ removeEventListener: () => {
64
+ signal.onabort = null;
65
+ },
66
+ };
67
+
68
+ executor(
69
+ (value) => {
70
+ if (!isCancelled) innerResolve(value);
71
+ },
72
+ (reason) => {
73
+ if (!isCancelled) innerReject(reason);
74
+ },
75
+ signal as any,
76
+ options.reason,
77
+ );
78
+
79
+ cancelPromiseResolve = () => {
80
+ if (signal.onabort) {
81
+ signal.onabort.call(signal, { type: "abort" } as Event);
82
+ }
83
+ abortListeners.forEach((listener) => {
84
+ try {
85
+ listener.call({ type: "abort" }, { type: "abort" } as Event);
86
+ } catch (error) {
87
+ FW.Log.error("Error in abort listener:", error);
88
+ }
89
+ });
90
+ };
91
+ } catch (error) {
92
+ if (!isCancelled) innerReject(error);
93
+ }
94
+ });
95
+
96
+ let timeoutPromise: Promise<T> | null = null;
97
+ if (options.timeout && options.timeout > 0) {
98
+ timeoutPromise = new Promise<T>((_, timeoutReject) => {
99
+ timerSchedule = FW.Entry.timeMgr.scheduleOnce(() => {
100
+ const timeoutError = new Error(
101
+ `Promise ${id} timeout after ${options.timeout} ms`,
102
+ );
103
+
104
+ if (
105
+ retryCount < maxRetryTimes &&
106
+ (!options.retryCondition ||
107
+ options.retryCondition(timeoutError, retryCount))
108
+ ) {
109
+ retryCount++;
110
+ FW.Log.debug(
111
+ `Promise ${id} timeout, retrying (${retryCount}/${maxRetryTimes})`,
112
+ );
113
+
114
+ if (retryInterval > 0) {
115
+ FW.Entry.timeMgr.scheduleOnce(() => {
116
+ createPromise().then(resolve, reject);
117
+ }, retryInterval);
118
+ } else {
119
+ createPromise().then(resolve, reject);
120
+ }
121
+ } else {
122
+ timeoutReject(timeoutError);
123
+ }
124
+ }, options.timeout / 1000);
125
+ });
126
+ }
127
+
128
+ const racePromises: Promise<T>[] = [mainPromise];
129
+
130
+ if (timeoutPromise) {
131
+ racePromises.push(timeoutPromise);
132
+ }
133
+
134
+ if (!isCancelled) {
135
+ const raceCancelPromise = cancelPromise as unknown as Promise<T>;
136
+ racePromises.push(raceCancelPromise);
137
+ }
138
+
139
+ Promise.race(racePromises)
140
+ .then((value) => {
141
+ if (isCancelled) return;
142
+ timerSchedule?.unSchedule();
143
+ resolve(value);
144
+ this.removePromise(id);
145
+ })
146
+ .catch((error) => {
147
+ if (isCancelled) return;
148
+
149
+ timerSchedule?.unSchedule();
150
+
151
+ if (
152
+ retryCount < maxRetryTimes &&
153
+ (!options.retryCondition ||
154
+ options.retryCondition(error, retryCount))
155
+ ) {
156
+ retryCount++;
157
+ FW.Log.debug(
158
+ `Promise ${id} failed, retrying (${retryCount}/${maxRetryTimes}):`,
159
+ error,
160
+ );
161
+
162
+ if (retryInterval > 0) {
163
+ FW.Entry.timeMgr.scheduleOnce(() => {
164
+ createPromise().then(resolve, reject);
165
+ }, retryInterval);
166
+ } else {
167
+ createPromise().then(resolve, reject);
168
+ }
169
+ } else {
170
+ reject(error);
171
+ this.removePromise(id);
172
+ }
173
+ });
174
+ });
175
+ };
176
+
177
+ const promise = createPromise();
178
+ const promiseProxy: FW.PromiseProxy<T> = {
179
+ id,
180
+ promise,
181
+ status: FW.SystemDefine.FWPromiseStatus.PENDING,
182
+ abort: (reason?: any) => {
183
+ if (promiseProxy.status === FW.SystemDefine.FWPromiseStatus.PENDING) {
184
+ FW.Log.debug(reason || "promise cancelled");
185
+ cancelResolve?.();
186
+ promiseProxy.status = FW.SystemDefine.FWPromiseStatus.CANCELLED;
187
+ }
188
+ },
189
+ addAbortEventListener: (
190
+ listener: (this: any, ev: Event) => any,
191
+ options?: boolean | AddEventListenerOptions,
192
+ ) => {
193
+ abortListeners.push(listener);
194
+ return () => {
195
+ const index = abortListeners.indexOf(listener);
196
+ if (index > -1) {
197
+ abortListeners.splice(index, 1);
198
+ }
199
+ };
200
+ },
201
+ };
202
+
203
+ this.promiseRegistry.set(id, promiseProxy);
204
+
205
+ promise
206
+ .then(() => {
207
+ if (promiseProxy.status === FW.SystemDefine.FWPromiseStatus.PENDING) {
208
+ promiseProxy.status = FW.SystemDefine.FWPromiseStatus.FULFILLED;
209
+ }
210
+ })
211
+ .catch((error) => {
212
+ if (promiseProxy.status === FW.SystemDefine.FWPromiseStatus.PENDING) {
213
+ promiseProxy.status = FW.SystemDefine.FWPromiseStatus.REJECTED;
214
+ }
215
+ });
216
+
217
+ return promiseProxy;
218
+ }
219
+
220
+ public all<T = any>(
221
+ promises: FW.PromiseProxy<T>[],
222
+ options: FW.PromiseExecuteOptions = {},
223
+ ): FW.PromiseProxy<FW.PromiseAllResult<T>> {
224
+ const id = this.uniqueId++;
225
+ const maxRetryTimes = options.retryCount || 0;
226
+ const retryInterval = options.retryInterval || 0;
227
+ let timerSchedule: FW.TimerSchedule;
228
+ let retryCount = 0;
229
+ let cancelResolve: (() => void) | null = null;
230
+ let isCancelled = false;
231
+ let abortListeners: Array<(this: any, ev: Event) => any> = [];
232
+
233
+ const createPromise = (): Promise<FW.PromiseAllResult<T>> => {
234
+ return new Promise<FW.PromiseAllResult<T>>((resolve, reject) => {
235
+ let cancelPromiseResolve: (() => void) | null = null;
236
+ const cancelPromise = new Promise<never>((_, rejectCancel) => {
237
+ cancelResolve = () => {
238
+ isCancelled = true;
239
+ if (cancelPromiseResolve) {
240
+ cancelPromiseResolve();
241
+ } else {
242
+ setTimeout(() => {
243
+ if (cancelPromiseResolve) cancelPromiseResolve();
244
+ }, 0);
245
+ }
246
+ };
247
+ }).then(() => {
248
+ return new Promise<never>(() => {});
249
+ });
250
+
251
+ const processAll = async (): Promise<FW.PromiseAllResult<T>> => {
252
+ const result: FW.PromiseAllResult<T> = {
253
+ success: [],
254
+ failed: [],
255
+ cancelled: [],
256
+ };
257
+
258
+ for (const promiseProxy of promises) {
259
+ if (isCancelled) {
260
+ const remainingIds = promises
261
+ .filter(
262
+ (p) =>
263
+ !result.success.some((s) => s.id === p.id) &&
264
+ !result.failed.some((f) => f.id === p.id),
265
+ )
266
+ .map((p) => p.id);
267
+ result.cancelled.push(...remainingIds);
268
+ break;
269
+ }
270
+
271
+ try {
272
+ const value = await promiseProxy.promise;
273
+ result.success.push({
274
+ id: promiseProxy.id,
275
+ value: value,
276
+ });
277
+ } catch (error) {
278
+ if (
279
+ promiseProxy.status ===
280
+ FW.SystemDefine.FWPromiseStatus.CANCELLED
281
+ ) {
282
+ result.cancelled.push(promiseProxy.id);
283
+ } else {
284
+ result.failed.push({
285
+ id: promiseProxy.id,
286
+ reason: error,
287
+ });
288
+ }
289
+ }
290
+ }
291
+
292
+ return result;
293
+ };
294
+
295
+ const mainPromise = processAll();
296
+
297
+ cancelPromiseResolve = () => {
298
+ abortListeners.forEach((listener) => {
299
+ try {
300
+ listener.call({ type: "abort" }, { type: "abort" } as Event);
301
+ } catch (error) {
302
+ FW.Log.error("Error in abort listener:", error);
303
+ }
304
+ });
305
+ };
306
+
307
+ let timeoutPromise: Promise<FW.PromiseAllResult<T>> | null = null;
308
+ if (options.timeout && options.timeout > 0) {
309
+ timeoutPromise = new Promise<FW.PromiseAllResult<T>>(
310
+ (_, timeoutReject) => {
311
+ timerSchedule = FW.Entry.timeMgr.scheduleOnce(() => {
312
+ const timeoutError = new Error(
313
+ `All Promise ${id} timeout after ${options.timeout} ms`,
314
+ );
315
+
316
+ if (
317
+ retryCount < maxRetryTimes &&
318
+ (!options.retryCondition ||
319
+ options.retryCondition(timeoutError, retryCount))
320
+ ) {
321
+ retryCount++;
322
+ FW.Log.debug(
323
+ `All Promise ${id} timeout, retrying (${retryCount}/${maxRetryTimes})`,
324
+ );
325
+
326
+ if (retryInterval > 0) {
327
+ FW.Entry.timeMgr.scheduleOnce(() => {
328
+ createPromise().then(resolve, reject);
329
+ }, retryInterval);
330
+ } else {
331
+ createPromise().then(resolve, reject);
332
+ }
333
+ } else {
334
+ timeoutReject(timeoutError);
335
+ }
336
+ }, options.timeout / 1000);
337
+ },
338
+ );
339
+ }
340
+
341
+ const racePromises: Promise<FW.PromiseAllResult<T>>[] = [mainPromise];
342
+
343
+ if (timeoutPromise) {
344
+ racePromises.push(timeoutPromise);
345
+ }
346
+
347
+ if (!isCancelled) {
348
+ const raceCancelPromise = cancelPromise as unknown as Promise<
349
+ FW.PromiseAllResult<T>
350
+ >;
351
+ racePromises.push(raceCancelPromise);
352
+ }
353
+
354
+ Promise.race(racePromises)
355
+ .then((result) => {
356
+ if (isCancelled) return;
357
+ timerSchedule?.unSchedule();
358
+ resolve(result);
359
+ this.removePromise(id);
360
+ })
361
+ .catch((error) => {
362
+ if (isCancelled) return;
363
+
364
+ timerSchedule?.unSchedule();
365
+
366
+ if (
367
+ retryCount < maxRetryTimes &&
368
+ (!options.retryCondition ||
369
+ options.retryCondition(error, retryCount))
370
+ ) {
371
+ retryCount++;
372
+ FW.Log.debug(
373
+ `All Promise ${id} failed, retrying (${retryCount}/${maxRetryTimes}):`,
374
+ error,
375
+ );
376
+
377
+ if (retryInterval > 0) {
378
+ FW.Entry.timeMgr.scheduleOnce(() => {
379
+ createPromise().then(resolve, reject);
380
+ }, retryInterval);
381
+ } else {
382
+ createPromise().then(resolve, reject);
383
+ }
384
+ } else {
385
+ reject(error);
386
+ this.removePromise(id);
387
+ }
388
+ });
389
+ });
390
+ };
391
+
392
+ const promise = createPromise();
393
+ const promiseProxy: FW.PromiseProxy<FW.PromiseAllResult<T>> = {
394
+ id,
395
+ promise,
396
+ status: FW.SystemDefine.FWPromiseStatus.PENDING,
397
+ abort: (reason?: any) => {
398
+ if (promiseProxy.status === FW.SystemDefine.FWPromiseStatus.PENDING) {
399
+ FW.Log.debug(reason || "all promise cancelled");
400
+ cancelResolve?.();
401
+ promiseProxy.status = FW.SystemDefine.FWPromiseStatus.CANCELLED;
402
+ }
403
+ },
404
+ addAbortEventListener: (
405
+ listener: (this: any, ev: Event) => any,
406
+ options?: boolean | AddEventListenerOptions,
407
+ ) => {
408
+ abortListeners.push(listener);
409
+ return () => {
410
+ const index = abortListeners.indexOf(listener);
411
+ if (index > -1) {
412
+ abortListeners.splice(index, 1);
413
+ }
414
+ };
415
+ },
416
+ };
417
+
418
+ this.promiseRegistry.set(id, promiseProxy);
419
+
420
+ promise
421
+ .then(() => {
422
+ if (promiseProxy.status === FW.SystemDefine.FWPromiseStatus.PENDING) {
423
+ promiseProxy.status = FW.SystemDefine.FWPromiseStatus.FULFILLED;
424
+ }
425
+ })
426
+ .catch((error) => {
427
+ if (promiseProxy.status === FW.SystemDefine.FWPromiseStatus.PENDING) {
428
+ promiseProxy.status = FW.SystemDefine.FWPromiseStatus.REJECTED;
429
+ }
430
+ });
431
+
432
+ return promiseProxy;
433
+ }
434
+
435
+ public cancel(id: number, reason?: any): boolean {
436
+ const promiseProxy = this.promiseRegistry.get(id);
437
+ if (
438
+ promiseProxy &&
439
+ promiseProxy.status === FW.SystemDefine.FWPromiseStatus.PENDING
440
+ ) {
441
+ promiseProxy.abort(reason);
442
+ return true;
443
+ }
444
+ return false;
445
+ }
446
+
447
+ public cancelMultiple(ids: number[], reason?: any): number[] {
448
+ const cancelled: number[] = [];
449
+ ids.forEach((id) => {
450
+ if (this.cancel(id, reason)) {
451
+ cancelled.push(id);
452
+ }
453
+ });
454
+ return cancelled;
455
+ }
456
+
457
+ public cancelAll(reason?: any): number[] {
458
+ const cancelled: number[] = [];
459
+ this.promiseRegistry.forEach((promiseProxy, id) => {
460
+ promiseProxy.abort(reason);
461
+ cancelled.push(id);
462
+ });
463
+ return cancelled;
464
+ }
465
+
466
+ public getStatus(id: number): FW.SystemDefine.FWPromiseStatus | null {
467
+ const promiseProxy = this.promiseRegistry.get(id);
468
+ return promiseProxy ? promiseProxy.status : null;
469
+ }
470
+
471
+ public getAllStatus(): Map<number, FW.SystemDefine.FWPromiseStatus> {
472
+ const statusMap = new Map<number, FW.SystemDefine.FWPromiseStatus>();
473
+ this.promiseRegistry.forEach((promiseProxy, id) => {
474
+ statusMap.set(id, promiseProxy.status);
475
+ });
476
+ return statusMap;
477
+ }
478
+
479
+ private removePromise(id: number): void {
480
+ this.promiseRegistry.delete(id);
481
+ }
482
+
483
+ public getActiveCount(): number {
484
+ return Array.from(this.promiseRegistry.values()).filter(
485
+ (p) => p.status === FW.SystemDefine.FWPromiseStatus.PENDING,
486
+ ).length;
487
+ }
488
+
489
+ public clearCompletedPromise(): number {
490
+ const completedIds: number[] = [];
491
+
492
+ this.promiseRegistry.forEach((promiseProxy, id) => {
493
+ if (promiseProxy.status !== FW.SystemDefine.FWPromiseStatus.PENDING) {
494
+ completedIds.push(id);
495
+ }
496
+ });
497
+
498
+ completedIds.forEach((id) => {
499
+ this.promiseRegistry.delete(id);
500
+ });
501
+
502
+ return completedIds.length;
503
+ }
504
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "ver": "1.1.0",
3
+ "uuid": "efe0f191-ae87-4773-9dbe-5c66f49670db",
4
+ "importer": "typescript",
5
+ "isPlugin": false,
6
+ "loadPluginInWeb": true,
7
+ "loadPluginInNative": true,
8
+ "loadPluginInEditor": false,
9
+ "subMetas": {}
10
+ }