@zwa73/utils 1.0.90 → 1.0.91

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.
@@ -103,7 +103,7 @@ export declare class UtilFunc {
103
103
  * @param task - 任务逻辑
104
104
  * @returns 处理结果
105
105
  */
106
- static queueProc<T>(flag: Keyable, task: (() => Promise<T>)): Promise<T>;
106
+ static queueProc<T>(flag: Keyable, task: () => Promise<T>): Promise<T>;
107
107
  /**队列获取目标的代办事件数
108
108
  * @param flag - 队列标签
109
109
  */
@@ -297,32 +297,48 @@ class UtilFunc {
297
297
  * @param task - 任务逻辑
298
298
  * @returns 处理结果
299
299
  */
300
- static async queueProc(flag, task) {
301
- this.pendingMap[flag] = this.pendingMap[flag] ?? [];
302
- const pending = this.pendingMap[flag];
303
- //尝试解除下个任务的等待
304
- const tryRes = () => {
305
- const thispd = pending;
306
- const resolve = thispd.shift();
307
- if (resolve)
308
- resolve();
300
+ static queueProc(flag, task) {
301
+ // 如果当前标签的队列不存在,则创建一个新的队列
302
+ if (!this.pendingMap[flag])
303
+ this.pendingMap[flag] = [];
304
+ // 创建一个新的Promise,并保存resolve函数以便后续调用
305
+ let resolveFunc;
306
+ const promise = new Promise((resolve) => {
307
+ resolveFunc = resolve;
308
+ });
309
+ // 定义处理任务的函数
310
+ const processTask = async () => {
311
+ let result;
312
+ try {
313
+ // 执行任务并等待结果
314
+ result = await task();
315
+ // 使用保存的resolve函数来解决Promise
316
+ resolveFunc(result);
317
+ }
318
+ catch (error) {
319
+ // 如果任务执行出错,记录错误日志
320
+ UtilLogger_1.SLogger.warn(`queueProc 错误: `, error, `flag: ${String(flag)}`);
321
+ }
322
+ finally {
323
+ // 无论任务是否成功,都从队列中移除当前任务
324
+ this.pendingMap[flag].shift();
325
+ // 如果队列中还有任务,执行下一个任务
326
+ if (this.pendingMap[flag].length > 0) {
327
+ this.pendingMap[flag][0]();
328
+ }
329
+ else {
330
+ // 如果队列中没有任务,删除队列
331
+ delete this.pendingMap[flag];
332
+ }
333
+ }
309
334
  };
310
- //空时直接运行 非空时等待
311
- if (pending.length <= 0)
312
- pending.push(() => tryRes());
313
- else
314
- await new Promise((resolve) => pending.push(resolve));
315
- try {
316
- return await task();
317
- ;
318
- }
319
- catch (e) {
320
- UtilLogger_1.SLogger.fatal(`queuePromise 出现错误`, e);
321
- throw e;
322
- }
323
- finally {
324
- tryRes();
325
- }
335
+ // 将处理任务的函数添加到队列中
336
+ this.pendingMap[flag].push(processTask);
337
+ // 如果队列中只有当前任务,立即执行
338
+ if (this.pendingMap[flag].length === 1)
339
+ processTask();
340
+ // 返回Promise,以便调用者可以等待任务完成
341
+ return promise;
326
342
  }
327
343
  /**队列获取目标的代办事件数
328
344
  * @param flag - 队列标签
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zwa73/utils",
3
- "version": "1.0.90",
3
+ "version": "1.0.91",
4
4
  "description": "my utils",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -356,30 +356,47 @@ static pendingMap:Record<Keyable,AnyFunc[]> = {};
356
356
  * @param task - 任务逻辑
357
357
  * @returns 处理结果
358
358
  */
359
- static async queueProc<T>(flag:Keyable,task:(()=>Promise<T>)):Promise<T> {
360
- this.pendingMap[flag] = this.pendingMap[flag]??[];
361
- const pending = this.pendingMap[flag];
362
-
363
- //尝试解除下个任务的等待
364
- const tryRes = () => {
365
- const thispd = pending;
366
- const resolve = thispd.shift();
367
- if(resolve) resolve();
368
- }
359
+ static queueProc<T>(flag: Keyable, task: () => Promise<T>): Promise<T> {
360
+ // 如果当前标签的队列不存在,则创建一个新的队列
361
+ if (!this.pendingMap[flag]) this.pendingMap[flag] = [];
362
+
363
+ // 创建一个新的Promise,并保存resolve函数以便后续调用
364
+ let resolveFunc: (value: T | PromiseLike<T>) => void;
365
+ const promise = new Promise<T>((resolve) => {
366
+ resolveFunc = resolve;
367
+ });
369
368
 
370
- //空时直接运行 非空时等待
371
- if (pending.length <= 0)
372
- pending.push(()=>tryRes());
373
- else await new Promise((resolve) => pending.push(resolve));
374
-
375
- try {
376
- return await task();;
377
- } catch(e){
378
- SLogger.fatal(`queuePromise 出现错误`,e);
379
- throw e;
380
- }finally {
381
- tryRes();
382
- }
369
+ // 定义处理任务的函数
370
+ const processTask = async () => {
371
+ let result: T;
372
+ try {
373
+ // 执行任务并等待结果
374
+ result = await task();
375
+ // 使用保存的resolve函数来解决Promise
376
+ resolveFunc(result);
377
+ } catch (error) {
378
+ // 如果任务执行出错,记录错误日志
379
+ SLogger.warn(`queueProc 错误: `,error,`flag: ${String(flag)}`);
380
+ } finally {
381
+ // 无论任务是否成功,都从队列中移除当前任务
382
+ this.pendingMap[flag].shift();
383
+ // 如果队列中还有任务,执行下一个任务
384
+ if (this.pendingMap[flag].length > 0) {
385
+ this.pendingMap[flag][0]();
386
+ } else {
387
+ // 如果队列中没有任务,删除队列
388
+ delete this.pendingMap[flag];
389
+ }
390
+ }
391
+ };
392
+
393
+ // 将处理任务的函数添加到队列中
394
+ this.pendingMap[flag].push(processTask);
395
+ // 如果队列中只有当前任务,立即执行
396
+ if (this.pendingMap[flag].length === 1) processTask();
397
+
398
+ // 返回Promise,以便调用者可以等待任务完成
399
+ return promise;
383
400
  }
384
401
  /**队列获取目标的代办事件数
385
402
  * @param flag - 队列标签