mm_expand 2.3.3 → 2.3.5
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.
- package/lib/array.js +36 -36
- package/lib/base.js +15 -15
- package/lib/date.js +9 -8
- package/lib/errors.js +99 -99
- package/lib/event.js +45 -45
- package/lib/eventer.js +214 -166
- package/lib/file.js +126 -14
- package/lib/global.js +51 -53
- package/lib/lang.js +10 -10
- package/lib/logger.js +2 -2
- package/lib/number.js +10 -10
- package/lib/object.js +72 -75
- package/lib/req.js +42 -42
- package/lib/ret.js +248 -249
- package/lib/string.js +87 -93
- package/lib/timer.js +15 -15
- package/lib/validator.js +11 -11
- package/package.json +6 -6
package/lib/eventer.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable mm_eslint/function-name */
|
|
1
2
|
require('./global.js');
|
|
2
3
|
|
|
3
4
|
/**
|
|
@@ -5,11 +6,11 @@ require('./global.js');
|
|
|
5
6
|
*/
|
|
6
7
|
class Eventer {
|
|
7
8
|
static config = {
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
max_list: 10, // 最大监听器数量
|
|
10
|
+
default_name: 'default', // 默认命名空间
|
|
10
11
|
chain_enabled: true, // 是否启用链式触发
|
|
11
12
|
auto_clean: true, // 是否自动清理空的事件列表
|
|
12
|
-
|
|
13
|
+
error: null, // 全局错误处理函数
|
|
13
14
|
pause_enabled: true, // 是否启用暂停功能
|
|
14
15
|
};
|
|
15
16
|
|
|
@@ -42,7 +43,7 @@ class Eventer {
|
|
|
42
43
|
this._paused_namespace = new Set(); // 暂停的命名空间
|
|
43
44
|
this._paused_global = false; // 全局暂停状态
|
|
44
45
|
// 初始化默认命名空间
|
|
45
|
-
this._namespace[this.config.
|
|
46
|
+
this._namespace[this.config.default_name] = true;
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
/**
|
|
@@ -113,10 +114,10 @@ Eventer.prototype._validateOnParams = function (key, func) {
|
|
|
113
114
|
};
|
|
114
115
|
|
|
115
116
|
Eventer.prototype._parseEventKey = function (key, ns) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
let parsed = this._parseKey(key);
|
|
118
|
+
let namespace = ns || parsed.namespace;
|
|
119
|
+
let event_key = parsed.key;
|
|
120
|
+
let full_key = `${namespace}:${event_key}`;
|
|
120
121
|
return { namespace, event_key, full_key };
|
|
121
122
|
};
|
|
122
123
|
|
|
@@ -144,12 +145,12 @@ Eventer.prototype._wrapFunction = function (func, params) {
|
|
|
144
145
|
}
|
|
145
146
|
|
|
146
147
|
if (params.timeout && typeof params.timeout === 'number' && params.timeout > 0) {
|
|
147
|
-
|
|
148
|
+
let original_func = wrapped_func;
|
|
148
149
|
wrapped_func = async function (...args) {
|
|
149
|
-
const
|
|
150
|
+
const timeoutPromise = new Promise((resolve, reject) => {
|
|
150
151
|
setTimeout(() => reject(new Error(`事件执行超时 (${params.timeout}ms)`)), params.timeout);
|
|
151
152
|
});
|
|
152
|
-
return Promise.race([original_func.apply(this, args),
|
|
153
|
+
return Promise.race([original_func.apply(this, args), timeoutPromise]);
|
|
153
154
|
};
|
|
154
155
|
}
|
|
155
156
|
|
|
@@ -179,10 +180,9 @@ Eventer.prototype._findHandlerIndex = function (list, name) {
|
|
|
179
180
|
};
|
|
180
181
|
|
|
181
182
|
Eventer.prototype._checkListenerLimit = function (namespace, event_key, list) {
|
|
182
|
-
|
|
183
|
-
if (
|
|
184
|
-
this.log('warn', `警告: '${namespace}:${event_key}' 事件的监听器数量已达到 ${
|
|
185
|
-
set_max_listeners() 方法可以增加限制。`);
|
|
183
|
+
let max_list = this.config.max_list;
|
|
184
|
+
if (max_list > 0 && list.length >= max_list) {
|
|
185
|
+
this.log('warn', `警告: '${namespace}:${event_key}' 事件的监听器数量已达到 ${max_list},可能导致内存泄漏。使用 set_max_listeners() 方法可以增加限制。`);
|
|
186
186
|
}
|
|
187
187
|
};
|
|
188
188
|
|
|
@@ -208,7 +208,7 @@ Eventer.prototype._createHandlerResult = function (namespace, index, name, full_
|
|
|
208
208
|
*/
|
|
209
209
|
Eventer.prototype.on = function (key, func, name, options) {
|
|
210
210
|
// 处理参数
|
|
211
|
-
|
|
211
|
+
let params = this._processOnParams(key, func, name, options);
|
|
212
212
|
|
|
213
213
|
// 验证参数
|
|
214
214
|
this._validateOnParams(params.key, params.func);
|
|
@@ -224,7 +224,7 @@ Eventer.prototype._processOnParams = function (key, func, name, options) {
|
|
|
224
224
|
return this._extractOnParams(key);
|
|
225
225
|
} else {
|
|
226
226
|
// 便捷方式
|
|
227
|
-
|
|
227
|
+
let opts = options || {};
|
|
228
228
|
return {
|
|
229
229
|
key: key,
|
|
230
230
|
func: func,
|
|
@@ -247,13 +247,13 @@ Eventer.prototype._addEventHandler = function (params) {
|
|
|
247
247
|
this._initNamespace(namespace, event_key);
|
|
248
248
|
|
|
249
249
|
// 设置默认名称
|
|
250
|
-
|
|
250
|
+
let final_name = eventName || this._generateDefaultName(eventFunc);
|
|
251
251
|
|
|
252
252
|
// 应用节流或防抖
|
|
253
|
-
|
|
253
|
+
let wrapped_func = this._wrapFunction(eventFunc, params);
|
|
254
254
|
|
|
255
255
|
// 创建事件对象
|
|
256
|
-
|
|
256
|
+
let obj = this._createHandlerObj({
|
|
257
257
|
name: final_name,
|
|
258
258
|
wrapped_func: wrapped_func,
|
|
259
259
|
func: eventFunc,
|
|
@@ -280,12 +280,12 @@ Eventer.prototype._processOnceParams = function (key, func, name, options) {
|
|
|
280
280
|
// 支持两种调用方式:便捷方式和配置对象方式
|
|
281
281
|
if (typeof key === 'object' && key !== null) {
|
|
282
282
|
// 配置对象方式
|
|
283
|
-
|
|
283
|
+
let params = this._extractOnParams(key);
|
|
284
284
|
params.times = 1; // 强制设置为仅执行一次
|
|
285
285
|
return params;
|
|
286
286
|
} else {
|
|
287
287
|
// 便捷方式
|
|
288
|
-
|
|
288
|
+
let opts = options || {};
|
|
289
289
|
return {
|
|
290
290
|
key: key,
|
|
291
291
|
func: func,
|
|
@@ -299,8 +299,8 @@ Eventer.prototype._processOnceParams = function (key, func, name, options) {
|
|
|
299
299
|
|
|
300
300
|
Eventer.prototype._handleEventAddition = function (config) {
|
|
301
301
|
const { namespace, event_key, full_key, final_name, obj } = config;
|
|
302
|
-
|
|
303
|
-
|
|
302
|
+
let list = this._dict[namespace][event_key];
|
|
303
|
+
let idx = this._findHandlerIndex(list, final_name);
|
|
304
304
|
|
|
305
305
|
if (idx >= 0) {
|
|
306
306
|
// 覆盖已存在的同名监听器
|
|
@@ -330,7 +330,7 @@ Eventer.prototype._handleEventAddition = function (config) {
|
|
|
330
330
|
*/
|
|
331
331
|
Eventer.prototype.once = function (key, func, name, options) {
|
|
332
332
|
// 处理参数
|
|
333
|
-
|
|
333
|
+
let params = this._processOnceParams(key, func, name, options);
|
|
334
334
|
|
|
335
335
|
// 验证参数
|
|
336
336
|
this._validateOnParams(params.key, params.func);
|
|
@@ -354,11 +354,11 @@ Eventer.prototype._validateExec = function (key) {
|
|
|
354
354
|
};
|
|
355
355
|
|
|
356
356
|
Eventer.prototype._createCtx = function (key, params) {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
357
|
+
let parsed = this._parseKey(key);
|
|
358
|
+
let namespace = parsed.namespace;
|
|
359
|
+
let event_key = parsed.key;
|
|
360
|
+
let full_key = `${namespace}:${event_key}`;
|
|
361
|
+
let start_time = Date.now();
|
|
362
362
|
|
|
363
363
|
const ctx = {
|
|
364
364
|
namespace,
|
|
@@ -385,7 +385,7 @@ Eventer.prototype._createCtx = function (key, params) {
|
|
|
385
385
|
Eventer.prototype._cancelTasks = function (full_key) {
|
|
386
386
|
try {
|
|
387
387
|
if (this._tasks.has(full_key)) {
|
|
388
|
-
|
|
388
|
+
let tasks = this._tasks.get(full_key);
|
|
389
389
|
tasks.forEach(task => {
|
|
390
390
|
if (task && typeof task.cancel === 'function') {
|
|
391
391
|
try {
|
|
@@ -516,8 +516,8 @@ Eventer.prototype._buildSafeResult = function (ctx) {
|
|
|
516
516
|
results: ctx.results || [],
|
|
517
517
|
cancelled: ctx.cancelled || false,
|
|
518
518
|
cancel: ctx.cancel || (() => { }),
|
|
519
|
-
|
|
520
|
-
|
|
519
|
+
race: ctx.race_result,
|
|
520
|
+
waterfall: ctx.results && ctx.results.length > 0 ? ctx.results[ctx.results.length - 1]
|
|
521
521
|
: undefined
|
|
522
522
|
};
|
|
523
523
|
} catch (return_error) {
|
|
@@ -543,7 +543,7 @@ Eventer.prototype._execute = async function (key, options = {}, ...params) {
|
|
|
543
543
|
return this._createPausedResult();
|
|
544
544
|
}
|
|
545
545
|
|
|
546
|
-
|
|
546
|
+
let list = this._dict[namespace] && this._dict[namespace][event_key];
|
|
547
547
|
const arr = [];
|
|
548
548
|
|
|
549
549
|
if (list && list.length > 0) {
|
|
@@ -592,7 +592,7 @@ Eventer.prototype._executeEventList = async function (config) {
|
|
|
592
592
|
|
|
593
593
|
this._initTaskList(full_key);
|
|
594
594
|
|
|
595
|
-
|
|
595
|
+
let cancelled = await this._runBeforeMiddleware(ctx, full_key);
|
|
596
596
|
if (cancelled) {
|
|
597
597
|
return {
|
|
598
598
|
results: [],
|
|
@@ -618,7 +618,7 @@ Eventer.prototype._executeSequential = async function (config) {
|
|
|
618
618
|
const { list, params, ctx, full_key, arr } = config;
|
|
619
619
|
|
|
620
620
|
for (let i = 0; i < list.length && !ctx.cancelled; i++) {
|
|
621
|
-
|
|
621
|
+
let o = list[i];
|
|
622
622
|
ctx.executed++;
|
|
623
623
|
o.last_executed = Date.now();
|
|
624
624
|
|
|
@@ -631,11 +631,11 @@ Eventer.prototype._execSingleTask = async function (o, params, ctx, options) {
|
|
|
631
631
|
const { full_key, arr } = options;
|
|
632
632
|
|
|
633
633
|
// 创建任务
|
|
634
|
-
|
|
634
|
+
let task = this._createTask(o, full_key);
|
|
635
635
|
|
|
636
636
|
try {
|
|
637
637
|
// 执行事件处理函数
|
|
638
|
-
|
|
638
|
+
let result = await o.func.apply(o, params);
|
|
639
639
|
|
|
640
640
|
// 处理成功结果
|
|
641
641
|
this._handleSuccessResult({ result, o, ctx, arr, task });
|
|
@@ -646,7 +646,7 @@ Eventer.prototype._execSingleTask = async function (o, params, ctx, options) {
|
|
|
646
646
|
};
|
|
647
647
|
|
|
648
648
|
Eventer.prototype._createTask = function (o, full_key) {
|
|
649
|
-
|
|
649
|
+
let task_id = `${o.name}_${Date.now()}`;
|
|
650
650
|
let cancelled = false;
|
|
651
651
|
const task = {
|
|
652
652
|
id: task_id,
|
|
@@ -657,7 +657,7 @@ Eventer.prototype._createTask = function (o, full_key) {
|
|
|
657
657
|
};
|
|
658
658
|
|
|
659
659
|
// 添加到进行中的任务列表
|
|
660
|
-
|
|
660
|
+
let tasks = this._tasks.get(full_key);
|
|
661
661
|
tasks.push(task);
|
|
662
662
|
|
|
663
663
|
return { task, tasks, cancelled };
|
|
@@ -712,18 +712,19 @@ Eventer.prototype._handleTaskError = function (e, o, ctx, task) {
|
|
|
712
712
|
*/
|
|
713
713
|
Eventer.prototype._executeParallel = async function (config) {
|
|
714
714
|
const { list, params, ctx, full_key, arr } = config;
|
|
715
|
-
|
|
716
|
-
|
|
715
|
+
let concurrency = this._getConcurrency(params);
|
|
716
|
+
// eslint-disable-next-line mm_eslint/class-instance-name
|
|
717
|
+
const proc_results = new Array(list.length);
|
|
717
718
|
|
|
718
719
|
if (concurrency < Infinity) {
|
|
719
720
|
await this._executeBatches({
|
|
720
|
-
list, params, ctx, full_key, arr, concurrency,
|
|
721
|
+
list, params, ctx, full_key, arr, concurrency, proc_results
|
|
721
722
|
});
|
|
722
723
|
} else {
|
|
723
|
-
await this._executeAllParallel({ list, params, ctx, full_key, arr,
|
|
724
|
+
await this._executeAllParallel({ list, params, ctx, full_key, arr, proc_results });
|
|
724
725
|
}
|
|
725
726
|
|
|
726
|
-
this._setResults(ctx,
|
|
727
|
+
this._setResults(ctx, proc_results);
|
|
727
728
|
};
|
|
728
729
|
|
|
729
730
|
Eventer.prototype._getConcurrency = function (params) {
|
|
@@ -732,14 +733,14 @@ Eventer.prototype._getConcurrency = function (params) {
|
|
|
732
733
|
};
|
|
733
734
|
|
|
734
735
|
Eventer.prototype._executeBatches = async function (config) {
|
|
735
|
-
const { list, params, ctx, full_key, arr, concurrency,
|
|
736
|
+
const { list, params, ctx, full_key, arr, concurrency, proc_results } = config;
|
|
736
737
|
|
|
737
738
|
for (let i = 0; i < list.length && !ctx.cancelled; i += concurrency) {
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
739
|
+
let batch = list.slice(i, i + concurrency);
|
|
740
|
+
let batch_promises = batch.map((obj, batch_idx) => {
|
|
741
|
+
let global = i + batch_idx; // eslint-disable-line mm_eslint/variable-name
|
|
741
742
|
return this._executeSingleTask({
|
|
742
|
-
obj, params, ctx, full_key, arr, idx:
|
|
743
|
+
obj, params, ctx, full_key, arr, idx: global, proc_results
|
|
743
744
|
});
|
|
744
745
|
});
|
|
745
746
|
|
|
@@ -748,17 +749,17 @@ Eventer.prototype._executeBatches = async function (config) {
|
|
|
748
749
|
};
|
|
749
750
|
|
|
750
751
|
Eventer.prototype._executeAllParallel = async function (config) {
|
|
751
|
-
const { list, params, ctx, full_key, arr,
|
|
752
|
+
const { list, params, ctx, full_key, arr, proc_results } = config;
|
|
752
753
|
|
|
753
|
-
|
|
754
|
-
return this._executeSingleTask({ obj, params, ctx, full_key, arr, idx,
|
|
754
|
+
let promises = list.map((obj, idx) => {
|
|
755
|
+
return this._executeSingleTask({ obj, params, ctx, full_key, arr, idx, proc_results });
|
|
755
756
|
});
|
|
756
757
|
|
|
757
758
|
await Promise.allSettled(promises);
|
|
758
759
|
};
|
|
759
760
|
|
|
760
|
-
Eventer.prototype._setResults = function (ctx,
|
|
761
|
-
ctx.results =
|
|
761
|
+
Eventer.prototype._setResults = function (ctx, proc_results) {
|
|
762
|
+
ctx.results = proc_results.filter(result => result !== undefined);
|
|
762
763
|
};
|
|
763
764
|
|
|
764
765
|
/**
|
|
@@ -768,16 +769,16 @@ Eventer.prototype._setResults = function (ctx, processed_results) {
|
|
|
768
769
|
*/
|
|
769
770
|
Eventer.prototype._executeWaterfall = async function (config) {
|
|
770
771
|
const { list, params, ctx, full_key, arr, initial_value } = config;
|
|
771
|
-
let
|
|
772
|
+
let wate_value = this._getInitialValue(params, initial_value);
|
|
772
773
|
|
|
773
774
|
for (let i = 0; i < list.length && !ctx.cancelled; i++) {
|
|
774
|
-
|
|
775
|
+
let obj = list[i];
|
|
775
776
|
ctx.executed++;
|
|
776
777
|
obj.last_executed = Date.now();
|
|
777
778
|
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
obj, params, ctx, arr, task,
|
|
779
|
+
let task = this._createWaterfallTask(obj, full_key);
|
|
780
|
+
wate_value = await this._execWaterfallStep({
|
|
781
|
+
obj, params, ctx, arr, task, wate_value
|
|
781
782
|
});
|
|
782
783
|
}
|
|
783
784
|
};
|
|
@@ -787,7 +788,7 @@ Eventer.prototype._getInitialValue = function (params, initial_value) {
|
|
|
787
788
|
};
|
|
788
789
|
|
|
789
790
|
Eventer.prototype._createWaterfallTask = function (obj, full_key) {
|
|
790
|
-
|
|
791
|
+
let task_id = `${obj.name}_${Date.now()}`;
|
|
791
792
|
let cancelled = false;
|
|
792
793
|
const task = {
|
|
793
794
|
id: task_id,
|
|
@@ -797,21 +798,21 @@ Eventer.prototype._createWaterfallTask = function (obj, full_key) {
|
|
|
797
798
|
cancel: () => { cancelled = true; }
|
|
798
799
|
};
|
|
799
800
|
|
|
800
|
-
|
|
801
|
+
let tasks = this._tasks.get(full_key);
|
|
801
802
|
tasks.push(task);
|
|
802
803
|
|
|
803
804
|
return { task, tasks, cancelled };
|
|
804
805
|
};
|
|
805
806
|
|
|
806
807
|
Eventer.prototype._execWaterfallStep = async function (config) {
|
|
807
|
-
const { obj, params, ctx, arr, task,
|
|
808
|
+
const { obj, params, ctx, arr, task, wate_value } = config;
|
|
808
809
|
try {
|
|
809
|
-
|
|
810
|
+
let result = await obj.func.apply(obj, [wate_value, ...params.slice(1)]);
|
|
810
811
|
this._handleWfSuccess({ result, obj, ctx, arr, task });
|
|
811
812
|
return result;
|
|
812
813
|
} catch (e) {
|
|
813
814
|
this._handleWfError({ e, obj, ctx, task });
|
|
814
|
-
return
|
|
815
|
+
return wate_value;
|
|
815
816
|
}
|
|
816
817
|
};
|
|
817
818
|
|
|
@@ -867,7 +868,7 @@ Eventer.prototype._callErrorHandler = function (e, obj, ctx) {
|
|
|
867
868
|
*/
|
|
868
869
|
Eventer.prototype._executeRace = async function (config) {
|
|
869
870
|
const { list, params, ctx, full_key, arr } = config;
|
|
870
|
-
|
|
871
|
+
let promises = this._createRacePromises({ list, params, ctx, full_key, arr });
|
|
871
872
|
|
|
872
873
|
return await this._runRace(promises);
|
|
873
874
|
};
|
|
@@ -877,11 +878,11 @@ Eventer.prototype._createRacePromises = function (config) {
|
|
|
877
878
|
const promises = [];
|
|
878
879
|
|
|
879
880
|
for (let i = 0; i < list.length && !ctx.cancelled; i++) {
|
|
880
|
-
|
|
881
|
+
let obj = list[i];
|
|
881
882
|
ctx.executed++;
|
|
882
883
|
obj.last_executed = Date.now();
|
|
883
884
|
|
|
884
|
-
|
|
885
|
+
let promise = this._createRacePromise({ obj, params, ctx, full_key, arr });
|
|
885
886
|
promises.push(promise);
|
|
886
887
|
}
|
|
887
888
|
|
|
@@ -890,11 +891,11 @@ Eventer.prototype._createRacePromises = function (config) {
|
|
|
890
891
|
|
|
891
892
|
Eventer.prototype._createRacePromise = function (config) {
|
|
892
893
|
const { obj, params, ctx, full_key, arr } = config;
|
|
893
|
-
|
|
894
|
+
let task = this._createRaceTask(obj, full_key);
|
|
894
895
|
|
|
895
896
|
return (async () => {
|
|
896
897
|
try {
|
|
897
|
-
|
|
898
|
+
let result = await obj.func.apply(obj, params);
|
|
898
899
|
return this._handleRaceSuccess({ result, obj, ctx, arr, task });
|
|
899
900
|
} catch (e) {
|
|
900
901
|
return this._handleRaceError(e, obj, ctx, task);
|
|
@@ -905,7 +906,7 @@ Eventer.prototype._createRacePromise = function (config) {
|
|
|
905
906
|
};
|
|
906
907
|
|
|
907
908
|
Eventer.prototype._createRaceTask = function (obj, full_key) {
|
|
908
|
-
|
|
909
|
+
let task_id = `${obj.name}_${Date.now()}`;
|
|
909
910
|
let cancelled = false;
|
|
910
911
|
const task = {
|
|
911
912
|
id: task_id,
|
|
@@ -915,7 +916,7 @@ Eventer.prototype._createRaceTask = function (obj, full_key) {
|
|
|
915
916
|
cancel: () => { cancelled = true; }
|
|
916
917
|
};
|
|
917
918
|
|
|
918
|
-
|
|
919
|
+
let tasks = this._tasks.get(full_key);
|
|
919
920
|
tasks.push(task);
|
|
920
921
|
|
|
921
922
|
return { task, tasks, cancelled };
|
|
@@ -951,8 +952,8 @@ Eventer.prototype._handleRaceError = function (e, obj, ctx, task) {
|
|
|
951
952
|
|
|
952
953
|
Eventer.prototype._runRace = async function (promises) {
|
|
953
954
|
if (promises.length > 0) {
|
|
954
|
-
|
|
955
|
-
return
|
|
955
|
+
let race = await Promise.race(promises);
|
|
956
|
+
return race;
|
|
956
957
|
}
|
|
957
958
|
return null;
|
|
958
959
|
};
|
|
@@ -963,22 +964,22 @@ Eventer.prototype._runRace = async function (promises) {
|
|
|
963
964
|
* @private
|
|
964
965
|
*/
|
|
965
966
|
Eventer.prototype._executeSingleTask = async function (config) {
|
|
966
|
-
const { obj, params, ctx, full_key, arr, idx,
|
|
967
|
+
const { obj, params, ctx, full_key, arr, idx, proc_results } = config;
|
|
967
968
|
obj.last_executed = Date.now();
|
|
968
969
|
|
|
969
970
|
// 创建任务
|
|
970
|
-
|
|
971
|
+
let task_info = this._createParallelTask(obj, full_key);
|
|
971
972
|
|
|
972
973
|
try {
|
|
973
|
-
|
|
974
|
-
this._handleTaskSuccess({ result, obj, ctx, arr, idx,
|
|
974
|
+
let result = await obj.func.apply(obj, params);
|
|
975
|
+
this._handleTaskSuccess({ result, obj, ctx, arr, idx, proc_results, task_info });
|
|
975
976
|
} catch (err) {
|
|
976
|
-
this._handleTaskError({ err, obj, ctx, idx,
|
|
977
|
+
this._handleTaskError({ err, obj, ctx, idx, proc_results, task_info });
|
|
977
978
|
}
|
|
978
979
|
};
|
|
979
980
|
|
|
980
981
|
Eventer.prototype._createParallelTask = function (obj, full_key) {
|
|
981
|
-
|
|
982
|
+
let task_id = `${obj.name}_${Date.now()}`;
|
|
982
983
|
let cancelled = false;
|
|
983
984
|
const task = {
|
|
984
985
|
id: task_id,
|
|
@@ -989,20 +990,20 @@ Eventer.prototype._createParallelTask = function (obj, full_key) {
|
|
|
989
990
|
};
|
|
990
991
|
|
|
991
992
|
// 添加到进行中的任务列表
|
|
992
|
-
|
|
993
|
+
let tasks = this._tasks.get(full_key);
|
|
993
994
|
tasks.push(task);
|
|
994
995
|
|
|
995
996
|
return { task, tasks, cancelled };
|
|
996
997
|
};
|
|
997
998
|
|
|
998
999
|
Eventer.prototype._handleTaskSuccess = function (config) {
|
|
999
|
-
const { result, obj, ctx, arr, idx,
|
|
1000
|
+
const { result, obj, ctx, arr, idx, proc_results, task_info } = config;
|
|
1000
1001
|
|
|
1001
1002
|
// 从进行中的任务列表中移除
|
|
1002
1003
|
task_info.tasks.splice(task_info.tasks.indexOf(task_info.task), 1);
|
|
1003
1004
|
|
|
1004
1005
|
if (!task_info.cancelled && !ctx.cancelled) {
|
|
1005
|
-
|
|
1006
|
+
proc_results[idx] = result;
|
|
1006
1007
|
|
|
1007
1008
|
// 处理执行次数限制
|
|
1008
1009
|
if (obj.times >= 0) {
|
|
@@ -1015,7 +1016,7 @@ Eventer.prototype._handleTaskSuccess = function (config) {
|
|
|
1015
1016
|
};
|
|
1016
1017
|
|
|
1017
1018
|
Eventer.prototype._handleTaskError = function (config) {
|
|
1018
|
-
const { err, obj, ctx, idx,
|
|
1019
|
+
const { err, obj, ctx, idx, proc_results, task_info } = config;
|
|
1019
1020
|
|
|
1020
1021
|
// 从进行中的任务列表中移除
|
|
1021
1022
|
task_info.tasks.splice(task_info.tasks.indexOf(task_info.task), 1);
|
|
@@ -1027,7 +1028,7 @@ Eventer.prototype._handleTaskError = function (config) {
|
|
|
1027
1028
|
handler: obj.name,
|
|
1028
1029
|
timestamp: Date.now()
|
|
1029
1030
|
};
|
|
1030
|
-
|
|
1031
|
+
proc_results[idx] = error_result;
|
|
1031
1032
|
|
|
1032
1033
|
// 全局错误处理器
|
|
1033
1034
|
if (this.config.error_handler && typeof this.config.error_handler === 'function') {
|
|
@@ -1055,7 +1056,7 @@ Eventer.prototype.run = async function (key, ...params) {
|
|
|
1055
1056
|
Eventer.prototype.emit = function (key, ...params) {
|
|
1056
1057
|
// 内部调用 _execute 方法,但不等待结果
|
|
1057
1058
|
try {
|
|
1058
|
-
|
|
1059
|
+
let result = this._execute(key, { exec_mode: 'sequential' }, ...params);
|
|
1059
1060
|
result.catch(e => this.log('error', '事件异步执行失败:', e));
|
|
1060
1061
|
return {
|
|
1061
1062
|
...result,
|
|
@@ -1094,7 +1095,7 @@ Eventer.prototype.emit = function (key, ...params) {
|
|
|
1094
1095
|
*/
|
|
1095
1096
|
Eventer.prototype.emitWait = async function (key, ...args) {
|
|
1096
1097
|
try {
|
|
1097
|
-
|
|
1098
|
+
let result = await this._execute(key, { exec_mode: 'sequential' }, ...args);
|
|
1098
1099
|
return result.results || [];
|
|
1099
1100
|
} catch (error) {
|
|
1100
1101
|
this.log('error', `等待事件触发失败 [${key}]`, error);
|
|
@@ -1119,13 +1120,13 @@ Eventer.prototype.emitAsync = async function (key, ...args) {
|
|
|
1119
1120
|
|
|
1120
1121
|
Eventer.prototype._execAsync = function (key, args) {
|
|
1121
1122
|
// 解析命名空间
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1123
|
+
let parsed = this._parseKey(key);
|
|
1124
|
+
let namespace = parsed.namespace;
|
|
1125
|
+
let event_key = parsed.key;
|
|
1126
|
+
let full_key = `${namespace}:${event_key}`;
|
|
1126
1127
|
|
|
1127
1128
|
// 获取事件列表
|
|
1128
|
-
|
|
1129
|
+
let list = this._dict[namespace] && this._dict[namespace][event_key];
|
|
1129
1130
|
|
|
1130
1131
|
if (!list || list.length === 0) {
|
|
1131
1132
|
return false;
|
|
@@ -1179,7 +1180,7 @@ Eventer.prototype._handleSyncError = function (sync_error, full_key, args) {
|
|
|
1179
1180
|
*/
|
|
1180
1181
|
Eventer.prototype.emitAll = async function (key, ...args) {
|
|
1181
1182
|
try {
|
|
1182
|
-
|
|
1183
|
+
let result = await this._execute(key, { exec_mode: 'parallel' }, ...args);
|
|
1183
1184
|
return result.results || [];
|
|
1184
1185
|
} catch (error) {
|
|
1185
1186
|
this.log('error', `并发事件触发失败 [${key}]`, error);
|
|
@@ -1195,14 +1196,61 @@ Eventer.prototype.emitAll = async function (key, ...args) {
|
|
|
1195
1196
|
*/
|
|
1196
1197
|
Eventer.prototype.emitRace = async function (key, ...args) {
|
|
1197
1198
|
try {
|
|
1198
|
-
|
|
1199
|
-
return result.
|
|
1199
|
+
let result = await this._execute(key, { exec_mode: 'race' }, ...args);
|
|
1200
|
+
return result.race || null;
|
|
1200
1201
|
} catch (error) {
|
|
1201
1202
|
this.log('error', `竞争事件触发失败 [${key}]`, error);
|
|
1202
1203
|
return null;
|
|
1203
1204
|
}
|
|
1204
1205
|
};
|
|
1205
1206
|
|
|
1207
|
+
/**
|
|
1208
|
+
* 异步触发事件,返回第一个有返回值的结果(不阻塞其他监听器)
|
|
1209
|
+
* @param {string} key 事件关键字,支持namespace:key格式
|
|
1210
|
+
* @param {...any} args 事件参数
|
|
1211
|
+
* @returns {Promise} - 第一个有返回值(非 undefined)的监听器结果
|
|
1212
|
+
* 所有监听器并行执行,返回第一个有返回值(非 undefined)的结果,
|
|
1213
|
+
* 返回 undefined 的监听器被跳过,其他监听器继续在后台执行不受影响
|
|
1214
|
+
*/
|
|
1215
|
+
Eventer.prototype.emitFirst = async function (key, ...args) {
|
|
1216
|
+
try {
|
|
1217
|
+
let parsed = this._parseKey(key);
|
|
1218
|
+
let namespace = parsed.namespace;
|
|
1219
|
+
let event_key = parsed.key;
|
|
1220
|
+
|
|
1221
|
+
let list = this._dict[namespace] && this._dict[namespace][event_key];
|
|
1222
|
+
if (!list || list.length === 0) {
|
|
1223
|
+
return undefined;
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
return await new Promise(resolve => {
|
|
1227
|
+
let settled = false;
|
|
1228
|
+
let pending = list.length;
|
|
1229
|
+
|
|
1230
|
+
for (let handler of list) {
|
|
1231
|
+
Promise.resolve(handler.func(...args)).then(result => {
|
|
1232
|
+
if (!settled && result !== undefined) {
|
|
1233
|
+
settled = true;
|
|
1234
|
+
resolve(result);
|
|
1235
|
+
}
|
|
1236
|
+
pending--;
|
|
1237
|
+
if (pending === 0 && !settled) {
|
|
1238
|
+
resolve(undefined);
|
|
1239
|
+
}
|
|
1240
|
+
}).catch(() => {
|
|
1241
|
+
pending--;
|
|
1242
|
+
if (pending === 0 && !settled) {
|
|
1243
|
+
resolve(undefined);
|
|
1244
|
+
}
|
|
1245
|
+
});
|
|
1246
|
+
}
|
|
1247
|
+
});
|
|
1248
|
+
} catch (error) {
|
|
1249
|
+
this.log('error', `首个结果事件触发失败 [${key}]`, error);
|
|
1250
|
+
return undefined;
|
|
1251
|
+
}
|
|
1252
|
+
};
|
|
1253
|
+
|
|
1206
1254
|
/**
|
|
1207
1255
|
* 异步触发事件,瀑布流执行
|
|
1208
1256
|
* @param {string} key 事件关键字,支持namespace:key格式
|
|
@@ -1212,11 +1260,11 @@ Eventer.prototype.emitRace = async function (key, ...args) {
|
|
|
1212
1260
|
*/
|
|
1213
1261
|
Eventer.prototype.emitWaterfall = async function (key, value, ...args) {
|
|
1214
1262
|
try {
|
|
1215
|
-
|
|
1263
|
+
let result = await this._execute(key, {
|
|
1216
1264
|
exec_mode: 'waterfall',
|
|
1217
1265
|
initial_value: value
|
|
1218
1266
|
}, ...args);
|
|
1219
|
-
return result.
|
|
1267
|
+
return result.waterfall || value;
|
|
1220
1268
|
} catch (error) {
|
|
1221
1269
|
this.log('error', `瀑布流事件触发失败 [${key}]`, error);
|
|
1222
1270
|
return value;
|
|
@@ -1249,16 +1297,16 @@ Eventer.prototype._ensureNs = function (name) {
|
|
|
1249
1297
|
* @returns {object} 包含结果和需要移除的事件名称的对象
|
|
1250
1298
|
*/
|
|
1251
1299
|
Eventer.prototype._execNsEvents = async function (name, key, params) {
|
|
1252
|
-
|
|
1300
|
+
let list = this._dict[name][key];
|
|
1253
1301
|
const namespace_results = [];
|
|
1254
1302
|
const arr = []; // 存储需要移除的事件
|
|
1255
1303
|
|
|
1256
1304
|
// 执行事件处理函数
|
|
1257
1305
|
for (let i = 0; i < list.length; i++) {
|
|
1258
1306
|
try {
|
|
1259
|
-
|
|
1307
|
+
let obj = list[i];
|
|
1260
1308
|
// 执行事件处理函数
|
|
1261
|
-
|
|
1309
|
+
let result = await obj.func.apply(obj, params);
|
|
1262
1310
|
namespace_results.push(result);
|
|
1263
1311
|
|
|
1264
1312
|
// 处理执行次数限制
|
|
@@ -1279,7 +1327,7 @@ Eventer.prototype._execNsEvents = async function (name, key, params) {
|
|
|
1279
1327
|
}
|
|
1280
1328
|
}
|
|
1281
1329
|
|
|
1282
|
-
return {
|
|
1330
|
+
return { name_results, arr };
|
|
1283
1331
|
};
|
|
1284
1332
|
|
|
1285
1333
|
/**
|
|
@@ -1298,29 +1346,23 @@ Eventer.prototype._removeEvents = function (name, key, arr) {
|
|
|
1298
1346
|
Eventer.prototype.emitAllNamespaces = async function (key, ...params) {
|
|
1299
1347
|
const results = {};
|
|
1300
1348
|
// 确保遍历所有命名空间,包括动态创建的
|
|
1301
|
-
for (
|
|
1349
|
+
for (let name in this._dict) {
|
|
1302
1350
|
// 确保命名空间在namespace映射中
|
|
1303
1351
|
this._ensureNs(name);
|
|
1304
1352
|
|
|
1305
1353
|
// 检查该命名空间下是否存在该事件
|
|
1306
1354
|
if (this._dict[name] && this._dict[name][key]) {
|
|
1307
|
-
const {
|
|
1355
|
+
const { name_results, arr } = await this._execNsEvents(name, key, params);
|
|
1308
1356
|
|
|
1309
1357
|
// 移除已执行完的事件
|
|
1310
1358
|
this._removeEvents(name, key, arr);
|
|
1311
1359
|
|
|
1312
|
-
results[name] =
|
|
1360
|
+
results[name] = name_results;
|
|
1313
1361
|
}
|
|
1314
1362
|
}
|
|
1315
1363
|
return results;
|
|
1316
1364
|
};
|
|
1317
1365
|
|
|
1318
|
-
/**
|
|
1319
|
-
* 删除事件
|
|
1320
|
-
* @param {string} key 事件关键字,支持namespace:key格式
|
|
1321
|
-
* @param {number | string} index_or_name 事件集索引或名称
|
|
1322
|
-
* @returns {boolean} 删除成功返回true,否则返回false
|
|
1323
|
-
*/
|
|
1324
1366
|
/**
|
|
1325
1367
|
* 删除单个事件监听器
|
|
1326
1368
|
* @private
|
|
@@ -1352,7 +1394,7 @@ Eventer.prototype._removeSingleEvent = function (events, index_or_name) {
|
|
|
1352
1394
|
* @private
|
|
1353
1395
|
* @param {string} namespace 命名空间
|
|
1354
1396
|
* @param {string} key 事件关键字
|
|
1355
|
-
* @param event_key
|
|
1397
|
+
* @param {string} event_key 事件键
|
|
1356
1398
|
* @param {string} full_key 完整事件关键字
|
|
1357
1399
|
* @returns {boolean} 删除成功返回true
|
|
1358
1400
|
*/
|
|
@@ -1367,7 +1409,7 @@ Eventer.prototype._removeEntireEvent = function (namespace, event_key, full_key)
|
|
|
1367
1409
|
|
|
1368
1410
|
// 清理相关的事件链
|
|
1369
1411
|
if (this._chain) {
|
|
1370
|
-
for (
|
|
1412
|
+
for (let chain_key in this._chain) {
|
|
1371
1413
|
if (chain_key === full_key) {
|
|
1372
1414
|
delete this._chain[chain_key];
|
|
1373
1415
|
} else if (this._chain[chain_key] && Array.is_array(this._chain[chain_key]) &&
|
|
@@ -1413,6 +1455,12 @@ Eventer.prototype._autoCleanEvents = function (namespace, key, events, index_or_
|
|
|
1413
1455
|
}
|
|
1414
1456
|
};
|
|
1415
1457
|
|
|
1458
|
+
/**
|
|
1459
|
+
* 删除事件
|
|
1460
|
+
* @param {string} key 事件关键字,支持namespace:key格式
|
|
1461
|
+
* @param {number | string} index_or_name 事件集索引或名称
|
|
1462
|
+
* @returns {boolean} 删除成功返回true,否则返回false
|
|
1463
|
+
*/
|
|
1416
1464
|
Eventer.prototype.off = function (key, index_or_name) {
|
|
1417
1465
|
// 入参校验
|
|
1418
1466
|
if (!key || typeof key !== 'string') {
|
|
@@ -1420,17 +1468,17 @@ Eventer.prototype.off = function (key, index_or_name) {
|
|
|
1420
1468
|
}
|
|
1421
1469
|
|
|
1422
1470
|
// 解析命名空间
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1471
|
+
let parsed = this._parseKey(key);
|
|
1472
|
+
let namespace = parsed.namespace;
|
|
1473
|
+
let event_key = parsed.key;
|
|
1474
|
+
let full_key = `${namespace}:${event_key}`;
|
|
1427
1475
|
|
|
1428
1476
|
// 检查事件是否存在
|
|
1429
1477
|
if (!this._dict[namespace] || !this._dict[namespace][event_key]) {
|
|
1430
1478
|
return false;
|
|
1431
1479
|
}
|
|
1432
1480
|
|
|
1433
|
-
|
|
1481
|
+
let events = this._dict[namespace][event_key];
|
|
1434
1482
|
let removed = false;
|
|
1435
1483
|
|
|
1436
1484
|
if (index_or_name) {
|
|
@@ -1481,9 +1529,9 @@ Eventer.prototype.getEvents = function (key) {
|
|
|
1481
1529
|
}
|
|
1482
1530
|
// 返回深拷贝的所有事件
|
|
1483
1531
|
const result = {};
|
|
1484
|
-
for (
|
|
1532
|
+
for (let name in this._dict) {
|
|
1485
1533
|
result[name] = {};
|
|
1486
|
-
for (
|
|
1534
|
+
for (let key in this._dict[name]) {
|
|
1487
1535
|
result[name][key] = [...this._dict[name][key]];
|
|
1488
1536
|
}
|
|
1489
1537
|
}
|
|
@@ -1535,7 +1583,7 @@ Eventer.prototype.clear = function (keepnamespace = false) {
|
|
|
1535
1583
|
if (!keepnamespace) {
|
|
1536
1584
|
this._namespace = {};
|
|
1537
1585
|
// 重新初始化默认命名空间
|
|
1538
|
-
this._namespace[this.config.
|
|
1586
|
+
this._namespace[this.config.default_name] = true;
|
|
1539
1587
|
}
|
|
1540
1588
|
|
|
1541
1589
|
return this;
|
|
@@ -1549,16 +1597,16 @@ Eventer.prototype.clear = function (keepnamespace = false) {
|
|
|
1549
1597
|
*/
|
|
1550
1598
|
Eventer.prototype.has = function (key, name) {
|
|
1551
1599
|
// 解析命名空间
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1600
|
+
let parsed = this._parseKey(key);
|
|
1601
|
+
let namespace = parsed.namespace;
|
|
1602
|
+
let event_key = parsed.key;
|
|
1555
1603
|
|
|
1556
1604
|
if (!this._dict[namespace] || !this._dict[namespace][event_key]) {
|
|
1557
1605
|
return false;
|
|
1558
1606
|
}
|
|
1559
1607
|
|
|
1560
1608
|
if (name) {
|
|
1561
|
-
|
|
1609
|
+
let list = this._dict[namespace][event_key];
|
|
1562
1610
|
for (let i = 0; i < list.length; i++) {
|
|
1563
1611
|
if (list[i].name === name) {
|
|
1564
1612
|
return true;
|
|
@@ -1580,10 +1628,10 @@ Eventer.prototype.count = function (key) {
|
|
|
1580
1628
|
// 解析可能的命名空间模式
|
|
1581
1629
|
if (key.ends_with(':*')) {
|
|
1582
1630
|
// 统计命名空间下所有事件
|
|
1583
|
-
|
|
1631
|
+
let namespace = key.split(':')[0];
|
|
1584
1632
|
if (this._dict[namespace]) {
|
|
1585
1633
|
let total = 0;
|
|
1586
|
-
for (
|
|
1634
|
+
for (let key in this._dict[namespace]) {
|
|
1587
1635
|
total += this._dict[namespace][key].length;
|
|
1588
1636
|
}
|
|
1589
1637
|
return total;
|
|
@@ -1600,8 +1648,8 @@ Eventer.prototype.count = function (key) {
|
|
|
1600
1648
|
|
|
1601
1649
|
// 统计所有事件
|
|
1602
1650
|
let total = 0;
|
|
1603
|
-
for (
|
|
1604
|
-
for (
|
|
1651
|
+
for (let name in this._dict) {
|
|
1652
|
+
for (let key in this._dict[name]) {
|
|
1605
1653
|
total += this._dict[name][key].length;
|
|
1606
1654
|
}
|
|
1607
1655
|
}
|
|
@@ -1640,7 +1688,7 @@ Eventer.prototype.chain = function (from_event, to_events) {
|
|
|
1640
1688
|
this._validateChainInput(from_event, to_events);
|
|
1641
1689
|
|
|
1642
1690
|
// 解析源事件
|
|
1643
|
-
|
|
1691
|
+
let full_from_event = this._getFullEventKey(from_event);
|
|
1644
1692
|
|
|
1645
1693
|
// 初始化事件链
|
|
1646
1694
|
this._initEventChain(full_from_event);
|
|
@@ -1670,7 +1718,7 @@ Eventer.prototype._initEventChain = function (full_from_event) {
|
|
|
1670
1718
|
|
|
1671
1719
|
Eventer.prototype._addTargetEvents = function (full_from_event, to_events) {
|
|
1672
1720
|
// 确保目标事件是数组
|
|
1673
|
-
|
|
1721
|
+
let target_events = Array.is_array(to_events) ? to_events : [to_events];
|
|
1674
1722
|
|
|
1675
1723
|
for (let i = 0; i < target_events.length; i++) {
|
|
1676
1724
|
this._addSingleTargetEvent(full_from_event, target_events[i]);
|
|
@@ -1683,7 +1731,7 @@ Eventer.prototype._addTargetEvent = function (full_from_event, to_event) {
|
|
|
1683
1731
|
}
|
|
1684
1732
|
|
|
1685
1733
|
// 解析目标事件
|
|
1686
|
-
|
|
1734
|
+
let full_to_event = this._getFullEventKey(to_event);
|
|
1687
1735
|
|
|
1688
1736
|
// 避免重复添加
|
|
1689
1737
|
if (!this._chain[full_from_event].includes(full_to_event)) {
|
|
@@ -1705,7 +1753,7 @@ Eventer.prototype.unchain = function (from_event, to_events) {
|
|
|
1705
1753
|
|
|
1706
1754
|
// 解析源事件
|
|
1707
1755
|
const { namespace: from_namespace, key: fromkey } = this._parseKey(from_event);
|
|
1708
|
-
|
|
1756
|
+
let full_from_event = `${from_namespace}:${fromkey}`;
|
|
1709
1757
|
|
|
1710
1758
|
// 如果源事件不存在事件链,直接返回
|
|
1711
1759
|
if (!this._chain[full_from_event]) {
|
|
@@ -1723,7 +1771,7 @@ Eventer.prototype.unchain = function (from_event, to_events) {
|
|
|
1723
1771
|
};
|
|
1724
1772
|
|
|
1725
1773
|
Eventer.prototype._removeTargetEvents = function (full_from_event, to_events) {
|
|
1726
|
-
|
|
1774
|
+
let target_events = Array.is_array(to_events) ? to_events : [to_events];
|
|
1727
1775
|
|
|
1728
1776
|
for (let i = 0; i < target_events.length; i++) {
|
|
1729
1777
|
this._removeTargetEvent(full_from_event, target_events[i]);
|
|
@@ -1742,7 +1790,7 @@ Eventer.prototype._removeTargetEvent = function (full_from_event, to_event) {
|
|
|
1742
1790
|
|
|
1743
1791
|
// 解析目标事件
|
|
1744
1792
|
const { namespace: to_namespace, key: tokey } = this._parseKey(to_event);
|
|
1745
|
-
|
|
1793
|
+
let full_to_event = `${to_namespace}:${tokey}`;
|
|
1746
1794
|
|
|
1747
1795
|
// 检查事件链是否存在
|
|
1748
1796
|
if (!this._chain[full_from_event]) {
|
|
@@ -1751,7 +1799,7 @@ Eventer.prototype._removeTargetEvent = function (full_from_event, to_event) {
|
|
|
1751
1799
|
}
|
|
1752
1800
|
|
|
1753
1801
|
// 查找并删除事件链
|
|
1754
|
-
|
|
1802
|
+
let index = this._chain[full_from_event].indexOf(full_to_event);
|
|
1755
1803
|
if (index === -1) {
|
|
1756
1804
|
this.log('warn', `事件链不存在: ${full_from_event} -> ${full_to_event}`);
|
|
1757
1805
|
return;
|
|
@@ -1772,7 +1820,7 @@ Eventer.prototype.getChains = function (event) {
|
|
|
1772
1820
|
|
|
1773
1821
|
// 解析事件
|
|
1774
1822
|
const { namespace, key } = this._parseKey(event);
|
|
1775
|
-
|
|
1823
|
+
let full_event = `${namespace}:${key}`;
|
|
1776
1824
|
|
|
1777
1825
|
return this._chain[full_event] ? [...this._chain[full_event]] : [];
|
|
1778
1826
|
};
|
|
@@ -1790,7 +1838,7 @@ Eventer.prototype._triggerChain = async function (current_event, params) {
|
|
|
1790
1838
|
}
|
|
1791
1839
|
|
|
1792
1840
|
// 循环触发下一级事件
|
|
1793
|
-
for (
|
|
1841
|
+
for (let next_event of this._chain[current_event]) {
|
|
1794
1842
|
await this._execChainItem(next_event, params);
|
|
1795
1843
|
}
|
|
1796
1844
|
};
|
|
@@ -1805,11 +1853,11 @@ Eventer.prototype._triggerChain = async function (current_event, params) {
|
|
|
1805
1853
|
Eventer.prototype._execChainItem = async function (key, params) {
|
|
1806
1854
|
// 解析命名空间
|
|
1807
1855
|
const { namespace, key: innerkey } = this._parseKey(key);
|
|
1808
|
-
|
|
1856
|
+
let list = this._dict[namespace] && this._dict[namespace][innerkey];
|
|
1809
1857
|
const results = [];
|
|
1810
1858
|
|
|
1811
1859
|
// 创建上下文对象
|
|
1812
|
-
|
|
1860
|
+
let ctx = this._createChainContext(namespace, innerkey, key, params);
|
|
1813
1861
|
|
|
1814
1862
|
// 如果有事件处理函数,执行它们
|
|
1815
1863
|
if (list && list.length > 0) {
|
|
@@ -1825,7 +1873,7 @@ Eventer.prototype._execChainItem = async function (key, params) {
|
|
|
1825
1873
|
};
|
|
1826
1874
|
|
|
1827
1875
|
Eventer.prototype._createChainContext = function (namespace, innerkey, key, params) {
|
|
1828
|
-
|
|
1876
|
+
let start_time = Date.now();
|
|
1829
1877
|
return {
|
|
1830
1878
|
namespace,
|
|
1831
1879
|
event: innerkey,
|
|
@@ -1872,7 +1920,7 @@ Eventer.prototype._execChainHandler = async function (obj, ctx, results) {
|
|
|
1872
1920
|
ctx.executed++;
|
|
1873
1921
|
|
|
1874
1922
|
// 执行事件处理函数
|
|
1875
|
-
|
|
1923
|
+
let result = await obj.func.apply(obj, ctx.params);
|
|
1876
1924
|
results.push(result);
|
|
1877
1925
|
ctx.results.push(result);
|
|
1878
1926
|
|
|
@@ -1914,7 +1962,7 @@ Eventer.prototype._handleChainError = function (e, obj, ctx, results) {
|
|
|
1914
1962
|
* @returns {Promise<object>} 返回包含results和cancel方法的对象
|
|
1915
1963
|
*/
|
|
1916
1964
|
Eventer.prototype.runParallel = async function (key, ...params) {
|
|
1917
|
-
|
|
1965
|
+
let result = await this._execute(key, {
|
|
1918
1966
|
exec_mode: 'parallel',
|
|
1919
1967
|
options: params.options
|
|
1920
1968
|
}, ...params);
|
|
@@ -1934,7 +1982,7 @@ Eventer.prototype.runParallel = async function (key, ...params) {
|
|
|
1934
1982
|
*/
|
|
1935
1983
|
Eventer.prototype.emitParallel = function (key, ...params) {
|
|
1936
1984
|
// 内部调用 _execute 方法,但不等待结果
|
|
1937
|
-
|
|
1985
|
+
let result = this._execute(key, {
|
|
1938
1986
|
exec_mode: 'parallel',
|
|
1939
1987
|
options: params.options
|
|
1940
1988
|
}, ...params);
|
|
@@ -1953,7 +2001,7 @@ Eventer.prototype.emitParallel = function (key, ...params) {
|
|
|
1953
2001
|
* @param {number} max_listeners 最大监听器数量
|
|
1954
2002
|
* @returns {Eventer} 返回当前实例,支持链式调用
|
|
1955
2003
|
*/
|
|
1956
|
-
Eventer.prototype.setMaxListeners = function (
|
|
2004
|
+
Eventer.prototype.setMaxListeners = function (max_list) {
|
|
1957
2005
|
if (typeof max_listeners !== 'number' || max_listeners < 0) {
|
|
1958
2006
|
throw new Error('最大监听器数量必须是一个非负数');
|
|
1959
2007
|
}
|
|
@@ -1971,7 +2019,7 @@ Eventer.prototype.onMany = function (events_map) {
|
|
|
1971
2019
|
throw new Error('事件对象必须是一个非空对象');
|
|
1972
2020
|
}
|
|
1973
2021
|
|
|
1974
|
-
for (
|
|
2022
|
+
for (let event_name in events_map) {
|
|
1975
2023
|
if (events_map.has_own_property(event_name)) {
|
|
1976
2024
|
this.on(event_name, events_map[event_name]);
|
|
1977
2025
|
}
|
|
@@ -1988,11 +2036,11 @@ Eventer.prototype.onMany = function (events_map) {
|
|
|
1988
2036
|
* @private
|
|
1989
2037
|
*/
|
|
1990
2038
|
Eventer.prototype._parseKey = function (key) {
|
|
1991
|
-
|
|
2039
|
+
let parts = key.split(':');
|
|
1992
2040
|
if (parts.length === 1) {
|
|
1993
2041
|
// 没有命名空间,使用默认命名空间
|
|
1994
2042
|
return {
|
|
1995
|
-
namespace: this.config.
|
|
2043
|
+
namespace: this.config.default_name,
|
|
1996
2044
|
key: key
|
|
1997
2045
|
};
|
|
1998
2046
|
} else if (parts.length === 2) {
|
|
@@ -2155,14 +2203,14 @@ Eventer.prototype._throttle = function (func, limit) {
|
|
|
2155
2203
|
let last_func;
|
|
2156
2204
|
let last_time = 0;
|
|
2157
2205
|
return function () {
|
|
2158
|
-
|
|
2159
|
-
|
|
2206
|
+
let ctx = this;
|
|
2207
|
+
let args = arguments;
|
|
2160
2208
|
if (!last_time) {
|
|
2161
2209
|
func.apply(ctx, args);
|
|
2162
2210
|
last_time = Date.now();
|
|
2163
2211
|
} else {
|
|
2164
2212
|
clearTimeout(last_func);
|
|
2165
|
-
last_func = setTimeout(
|
|
2213
|
+
last_func = setTimeout(() => {
|
|
2166
2214
|
if ((Date.now() - last_time) >= limit) {
|
|
2167
2215
|
func.apply(ctx, args);
|
|
2168
2216
|
last_time = Date.now();
|
|
@@ -2182,10 +2230,10 @@ Eventer.prototype._throttle = function (func, limit) {
|
|
|
2182
2230
|
Eventer.prototype._debounce = function (func, wait) {
|
|
2183
2231
|
let timeout;
|
|
2184
2232
|
return function () {
|
|
2185
|
-
|
|
2186
|
-
|
|
2233
|
+
let ctx = this;
|
|
2234
|
+
let args = arguments;
|
|
2187
2235
|
clearTimeout(timeout);
|
|
2188
|
-
timeout = setTimeout(
|
|
2236
|
+
timeout = setTimeout(() => {
|
|
2189
2237
|
func.apply(ctx, args);
|
|
2190
2238
|
}, wait);
|
|
2191
2239
|
};
|
|
@@ -2208,10 +2256,10 @@ Eventer.prototype.pause = function (key = '') {
|
|
|
2208
2256
|
}
|
|
2209
2257
|
|
|
2210
2258
|
// 解析关键字
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2259
|
+
let parsed = this._parseKey(key);
|
|
2260
|
+
let namespace = parsed.namespace;
|
|
2261
|
+
let event_key = parsed.key;
|
|
2262
|
+
let full_key = `${namespace}:${event_key}`;
|
|
2215
2263
|
|
|
2216
2264
|
if (key) {
|
|
2217
2265
|
return this._pauseEvent(full_key);
|
|
@@ -2266,10 +2314,10 @@ Eventer.prototype.resume = function (key = '') {
|
|
|
2266
2314
|
}
|
|
2267
2315
|
|
|
2268
2316
|
// 解析关键字
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2317
|
+
let parsed = this._parseKey(key);
|
|
2318
|
+
let namespace = parsed.namespace;
|
|
2319
|
+
let event_key = parsed.key;
|
|
2320
|
+
let full_key = `${namespace}:${event_key}`;
|
|
2273
2321
|
|
|
2274
2322
|
if (key) {
|
|
2275
2323
|
return this._resumeEvent(full_key);
|
|
@@ -2324,10 +2372,10 @@ Eventer.prototype.isPaused = function (key) {
|
|
|
2324
2372
|
}
|
|
2325
2373
|
|
|
2326
2374
|
// 解析关键字
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2375
|
+
let parsed = this._parseKey(key);
|
|
2376
|
+
let namespace = parsed.namespace;
|
|
2377
|
+
let event_key = parsed.key;
|
|
2378
|
+
let full_key = `${namespace}:${event_key}`;
|
|
2331
2379
|
|
|
2332
2380
|
// 命名空间暂停检查
|
|
2333
2381
|
if (this._paused_namespace.has(namespace)) {
|
|
@@ -2350,7 +2398,7 @@ Eventer.prototype.getPausedStatus = function () {
|
|
|
2350
2398
|
return {
|
|
2351
2399
|
global_paused: this._paused_global,
|
|
2352
2400
|
paused_events: Array.from(this._paused),
|
|
2353
|
-
paused_namespaces: Array.from(this._paused_namespace)
|
|
2401
|
+
paused_namespaces: Array.from(this._paused_namespace), // eslint-disable-line mm_eslint/variable-name
|
|
2354
2402
|
};
|
|
2355
2403
|
};
|
|
2356
2404
|
|