mm_expand 2.3.4 → 2.3.6
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 +166 -165
- package/lib/file.js +127 -15
- 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 +247 -248
- 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,8 +1196,8 @@ 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;
|
|
@@ -1208,16 +1209,16 @@ Eventer.prototype.emitRace = async function (key, ...args) {
|
|
|
1208
1209
|
* @param {string} key 事件关键字,支持namespace:key格式
|
|
1209
1210
|
* @param {...any} args 事件参数
|
|
1210
1211
|
* @returns {Promise} - 第一个有返回值(非 undefined)的监听器结果
|
|
1211
|
-
*
|
|
1212
|
+
* 所有监听器并行执行,返回第一个有返回值(非 undefined)的结果,
|
|
1212
1213
|
* 返回 undefined 的监听器被跳过,其他监听器继续在后台执行不受影响
|
|
1213
1214
|
*/
|
|
1214
1215
|
Eventer.prototype.emitFirst = async function (key, ...args) {
|
|
1215
1216
|
try {
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1217
|
+
let parsed = this._parseKey(key);
|
|
1218
|
+
let namespace = parsed.namespace;
|
|
1219
|
+
let event_key = parsed.key;
|
|
1219
1220
|
|
|
1220
|
-
|
|
1221
|
+
let list = this._dict[namespace] && this._dict[namespace][event_key];
|
|
1221
1222
|
if (!list || list.length === 0) {
|
|
1222
1223
|
return undefined;
|
|
1223
1224
|
}
|
|
@@ -1226,7 +1227,7 @@ Eventer.prototype.emitFirst = async function (key, ...args) {
|
|
|
1226
1227
|
let settled = false;
|
|
1227
1228
|
let pending = list.length;
|
|
1228
1229
|
|
|
1229
|
-
for (
|
|
1230
|
+
for (let handler of list) {
|
|
1230
1231
|
Promise.resolve(handler.func(...args)).then(result => {
|
|
1231
1232
|
if (!settled && result !== undefined) {
|
|
1232
1233
|
settled = true;
|
|
@@ -1259,11 +1260,11 @@ Eventer.prototype.emitFirst = async function (key, ...args) {
|
|
|
1259
1260
|
*/
|
|
1260
1261
|
Eventer.prototype.emitWaterfall = async function (key, value, ...args) {
|
|
1261
1262
|
try {
|
|
1262
|
-
|
|
1263
|
+
let result = await this._execute(key, {
|
|
1263
1264
|
exec_mode: 'waterfall',
|
|
1264
1265
|
initial_value: value
|
|
1265
1266
|
}, ...args);
|
|
1266
|
-
return result.
|
|
1267
|
+
return result.waterfall || value;
|
|
1267
1268
|
} catch (error) {
|
|
1268
1269
|
this.log('error', `瀑布流事件触发失败 [${key}]`, error);
|
|
1269
1270
|
return value;
|
|
@@ -1296,16 +1297,16 @@ Eventer.prototype._ensureNs = function (name) {
|
|
|
1296
1297
|
* @returns {object} 包含结果和需要移除的事件名称的对象
|
|
1297
1298
|
*/
|
|
1298
1299
|
Eventer.prototype._execNsEvents = async function (name, key, params) {
|
|
1299
|
-
|
|
1300
|
+
let list = this._dict[name][key];
|
|
1300
1301
|
const namespace_results = [];
|
|
1301
1302
|
const arr = []; // 存储需要移除的事件
|
|
1302
1303
|
|
|
1303
1304
|
// 执行事件处理函数
|
|
1304
1305
|
for (let i = 0; i < list.length; i++) {
|
|
1305
1306
|
try {
|
|
1306
|
-
|
|
1307
|
+
let obj = list[i];
|
|
1307
1308
|
// 执行事件处理函数
|
|
1308
|
-
|
|
1309
|
+
let result = await obj.func.apply(obj, params);
|
|
1309
1310
|
namespace_results.push(result);
|
|
1310
1311
|
|
|
1311
1312
|
// 处理执行次数限制
|
|
@@ -1326,7 +1327,7 @@ Eventer.prototype._execNsEvents = async function (name, key, params) {
|
|
|
1326
1327
|
}
|
|
1327
1328
|
}
|
|
1328
1329
|
|
|
1329
|
-
return {
|
|
1330
|
+
return { name_results, arr };
|
|
1330
1331
|
};
|
|
1331
1332
|
|
|
1332
1333
|
/**
|
|
@@ -1345,18 +1346,18 @@ Eventer.prototype._removeEvents = function (name, key, arr) {
|
|
|
1345
1346
|
Eventer.prototype.emitAllNamespaces = async function (key, ...params) {
|
|
1346
1347
|
const results = {};
|
|
1347
1348
|
// 确保遍历所有命名空间,包括动态创建的
|
|
1348
|
-
for (
|
|
1349
|
+
for (let name in this._dict) {
|
|
1349
1350
|
// 确保命名空间在namespace映射中
|
|
1350
1351
|
this._ensureNs(name);
|
|
1351
1352
|
|
|
1352
1353
|
// 检查该命名空间下是否存在该事件
|
|
1353
1354
|
if (this._dict[name] && this._dict[name][key]) {
|
|
1354
|
-
const {
|
|
1355
|
+
const { name_results, arr } = await this._execNsEvents(name, key, params);
|
|
1355
1356
|
|
|
1356
1357
|
// 移除已执行完的事件
|
|
1357
1358
|
this._removeEvents(name, key, arr);
|
|
1358
1359
|
|
|
1359
|
-
results[name] =
|
|
1360
|
+
results[name] = name_results;
|
|
1360
1361
|
}
|
|
1361
1362
|
}
|
|
1362
1363
|
return results;
|
|
@@ -1408,7 +1409,7 @@ Eventer.prototype._removeEntireEvent = function (namespace, event_key, full_key)
|
|
|
1408
1409
|
|
|
1409
1410
|
// 清理相关的事件链
|
|
1410
1411
|
if (this._chain) {
|
|
1411
|
-
for (
|
|
1412
|
+
for (let chain_key in this._chain) {
|
|
1412
1413
|
if (chain_key === full_key) {
|
|
1413
1414
|
delete this._chain[chain_key];
|
|
1414
1415
|
} else if (this._chain[chain_key] && Array.is_array(this._chain[chain_key]) &&
|
|
@@ -1467,17 +1468,17 @@ Eventer.prototype.off = function (key, index_or_name) {
|
|
|
1467
1468
|
}
|
|
1468
1469
|
|
|
1469
1470
|
// 解析命名空间
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1471
|
+
let parsed = this._parseKey(key);
|
|
1472
|
+
let namespace = parsed.namespace;
|
|
1473
|
+
let event_key = parsed.key;
|
|
1474
|
+
let full_key = `${namespace}:${event_key}`;
|
|
1474
1475
|
|
|
1475
1476
|
// 检查事件是否存在
|
|
1476
1477
|
if (!this._dict[namespace] || !this._dict[namespace][event_key]) {
|
|
1477
1478
|
return false;
|
|
1478
1479
|
}
|
|
1479
1480
|
|
|
1480
|
-
|
|
1481
|
+
let events = this._dict[namespace][event_key];
|
|
1481
1482
|
let removed = false;
|
|
1482
1483
|
|
|
1483
1484
|
if (index_or_name) {
|
|
@@ -1528,9 +1529,9 @@ Eventer.prototype.getEvents = function (key) {
|
|
|
1528
1529
|
}
|
|
1529
1530
|
// 返回深拷贝的所有事件
|
|
1530
1531
|
const result = {};
|
|
1531
|
-
for (
|
|
1532
|
+
for (let name in this._dict) {
|
|
1532
1533
|
result[name] = {};
|
|
1533
|
-
for (
|
|
1534
|
+
for (let key in this._dict[name]) {
|
|
1534
1535
|
result[name][key] = [...this._dict[name][key]];
|
|
1535
1536
|
}
|
|
1536
1537
|
}
|
|
@@ -1582,7 +1583,7 @@ Eventer.prototype.clear = function (keepnamespace = false) {
|
|
|
1582
1583
|
if (!keepnamespace) {
|
|
1583
1584
|
this._namespace = {};
|
|
1584
1585
|
// 重新初始化默认命名空间
|
|
1585
|
-
this._namespace[this.config.
|
|
1586
|
+
this._namespace[this.config.default_name] = true;
|
|
1586
1587
|
}
|
|
1587
1588
|
|
|
1588
1589
|
return this;
|
|
@@ -1596,16 +1597,16 @@ Eventer.prototype.clear = function (keepnamespace = false) {
|
|
|
1596
1597
|
*/
|
|
1597
1598
|
Eventer.prototype.has = function (key, name) {
|
|
1598
1599
|
// 解析命名空间
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1600
|
+
let parsed = this._parseKey(key);
|
|
1601
|
+
let namespace = parsed.namespace;
|
|
1602
|
+
let event_key = parsed.key;
|
|
1602
1603
|
|
|
1603
1604
|
if (!this._dict[namespace] || !this._dict[namespace][event_key]) {
|
|
1604
1605
|
return false;
|
|
1605
1606
|
}
|
|
1606
1607
|
|
|
1607
1608
|
if (name) {
|
|
1608
|
-
|
|
1609
|
+
let list = this._dict[namespace][event_key];
|
|
1609
1610
|
for (let i = 0; i < list.length; i++) {
|
|
1610
1611
|
if (list[i].name === name) {
|
|
1611
1612
|
return true;
|
|
@@ -1627,10 +1628,10 @@ Eventer.prototype.count = function (key) {
|
|
|
1627
1628
|
// 解析可能的命名空间模式
|
|
1628
1629
|
if (key.ends_with(':*')) {
|
|
1629
1630
|
// 统计命名空间下所有事件
|
|
1630
|
-
|
|
1631
|
+
let namespace = key.split(':')[0];
|
|
1631
1632
|
if (this._dict[namespace]) {
|
|
1632
1633
|
let total = 0;
|
|
1633
|
-
for (
|
|
1634
|
+
for (let key in this._dict[namespace]) {
|
|
1634
1635
|
total += this._dict[namespace][key].length;
|
|
1635
1636
|
}
|
|
1636
1637
|
return total;
|
|
@@ -1647,8 +1648,8 @@ Eventer.prototype.count = function (key) {
|
|
|
1647
1648
|
|
|
1648
1649
|
// 统计所有事件
|
|
1649
1650
|
let total = 0;
|
|
1650
|
-
for (
|
|
1651
|
-
for (
|
|
1651
|
+
for (let name in this._dict) {
|
|
1652
|
+
for (let key in this._dict[name]) {
|
|
1652
1653
|
total += this._dict[name][key].length;
|
|
1653
1654
|
}
|
|
1654
1655
|
}
|
|
@@ -1687,7 +1688,7 @@ Eventer.prototype.chain = function (from_event, to_events) {
|
|
|
1687
1688
|
this._validateChainInput(from_event, to_events);
|
|
1688
1689
|
|
|
1689
1690
|
// 解析源事件
|
|
1690
|
-
|
|
1691
|
+
let full_from_event = this._getFullEventKey(from_event);
|
|
1691
1692
|
|
|
1692
1693
|
// 初始化事件链
|
|
1693
1694
|
this._initEventChain(full_from_event);
|
|
@@ -1717,7 +1718,7 @@ Eventer.prototype._initEventChain = function (full_from_event) {
|
|
|
1717
1718
|
|
|
1718
1719
|
Eventer.prototype._addTargetEvents = function (full_from_event, to_events) {
|
|
1719
1720
|
// 确保目标事件是数组
|
|
1720
|
-
|
|
1721
|
+
let target_events = Array.is_array(to_events) ? to_events : [to_events];
|
|
1721
1722
|
|
|
1722
1723
|
for (let i = 0; i < target_events.length; i++) {
|
|
1723
1724
|
this._addSingleTargetEvent(full_from_event, target_events[i]);
|
|
@@ -1730,7 +1731,7 @@ Eventer.prototype._addTargetEvent = function (full_from_event, to_event) {
|
|
|
1730
1731
|
}
|
|
1731
1732
|
|
|
1732
1733
|
// 解析目标事件
|
|
1733
|
-
|
|
1734
|
+
let full_to_event = this._getFullEventKey(to_event);
|
|
1734
1735
|
|
|
1735
1736
|
// 避免重复添加
|
|
1736
1737
|
if (!this._chain[full_from_event].includes(full_to_event)) {
|
|
@@ -1752,7 +1753,7 @@ Eventer.prototype.unchain = function (from_event, to_events) {
|
|
|
1752
1753
|
|
|
1753
1754
|
// 解析源事件
|
|
1754
1755
|
const { namespace: from_namespace, key: fromkey } = this._parseKey(from_event);
|
|
1755
|
-
|
|
1756
|
+
let full_from_event = `${from_namespace}:${fromkey}`;
|
|
1756
1757
|
|
|
1757
1758
|
// 如果源事件不存在事件链,直接返回
|
|
1758
1759
|
if (!this._chain[full_from_event]) {
|
|
@@ -1770,7 +1771,7 @@ Eventer.prototype.unchain = function (from_event, to_events) {
|
|
|
1770
1771
|
};
|
|
1771
1772
|
|
|
1772
1773
|
Eventer.prototype._removeTargetEvents = function (full_from_event, to_events) {
|
|
1773
|
-
|
|
1774
|
+
let target_events = Array.is_array(to_events) ? to_events : [to_events];
|
|
1774
1775
|
|
|
1775
1776
|
for (let i = 0; i < target_events.length; i++) {
|
|
1776
1777
|
this._removeTargetEvent(full_from_event, target_events[i]);
|
|
@@ -1789,7 +1790,7 @@ Eventer.prototype._removeTargetEvent = function (full_from_event, to_event) {
|
|
|
1789
1790
|
|
|
1790
1791
|
// 解析目标事件
|
|
1791
1792
|
const { namespace: to_namespace, key: tokey } = this._parseKey(to_event);
|
|
1792
|
-
|
|
1793
|
+
let full_to_event = `${to_namespace}:${tokey}`;
|
|
1793
1794
|
|
|
1794
1795
|
// 检查事件链是否存在
|
|
1795
1796
|
if (!this._chain[full_from_event]) {
|
|
@@ -1798,7 +1799,7 @@ Eventer.prototype._removeTargetEvent = function (full_from_event, to_event) {
|
|
|
1798
1799
|
}
|
|
1799
1800
|
|
|
1800
1801
|
// 查找并删除事件链
|
|
1801
|
-
|
|
1802
|
+
let index = this._chain[full_from_event].indexOf(full_to_event);
|
|
1802
1803
|
if (index === -1) {
|
|
1803
1804
|
this.log('warn', `事件链不存在: ${full_from_event} -> ${full_to_event}`);
|
|
1804
1805
|
return;
|
|
@@ -1819,7 +1820,7 @@ Eventer.prototype.getChains = function (event) {
|
|
|
1819
1820
|
|
|
1820
1821
|
// 解析事件
|
|
1821
1822
|
const { namespace, key } = this._parseKey(event);
|
|
1822
|
-
|
|
1823
|
+
let full_event = `${namespace}:${key}`;
|
|
1823
1824
|
|
|
1824
1825
|
return this._chain[full_event] ? [...this._chain[full_event]] : [];
|
|
1825
1826
|
};
|
|
@@ -1837,7 +1838,7 @@ Eventer.prototype._triggerChain = async function (current_event, params) {
|
|
|
1837
1838
|
}
|
|
1838
1839
|
|
|
1839
1840
|
// 循环触发下一级事件
|
|
1840
|
-
for (
|
|
1841
|
+
for (let next_event of this._chain[current_event]) {
|
|
1841
1842
|
await this._execChainItem(next_event, params);
|
|
1842
1843
|
}
|
|
1843
1844
|
};
|
|
@@ -1852,11 +1853,11 @@ Eventer.prototype._triggerChain = async function (current_event, params) {
|
|
|
1852
1853
|
Eventer.prototype._execChainItem = async function (key, params) {
|
|
1853
1854
|
// 解析命名空间
|
|
1854
1855
|
const { namespace, key: innerkey } = this._parseKey(key);
|
|
1855
|
-
|
|
1856
|
+
let list = this._dict[namespace] && this._dict[namespace][innerkey];
|
|
1856
1857
|
const results = [];
|
|
1857
1858
|
|
|
1858
1859
|
// 创建上下文对象
|
|
1859
|
-
|
|
1860
|
+
let ctx = this._createChainContext(namespace, innerkey, key, params);
|
|
1860
1861
|
|
|
1861
1862
|
// 如果有事件处理函数,执行它们
|
|
1862
1863
|
if (list && list.length > 0) {
|
|
@@ -1872,7 +1873,7 @@ Eventer.prototype._execChainItem = async function (key, params) {
|
|
|
1872
1873
|
};
|
|
1873
1874
|
|
|
1874
1875
|
Eventer.prototype._createChainContext = function (namespace, innerkey, key, params) {
|
|
1875
|
-
|
|
1876
|
+
let start_time = Date.now();
|
|
1876
1877
|
return {
|
|
1877
1878
|
namespace,
|
|
1878
1879
|
event: innerkey,
|
|
@@ -1919,7 +1920,7 @@ Eventer.prototype._execChainHandler = async function (obj, ctx, results) {
|
|
|
1919
1920
|
ctx.executed++;
|
|
1920
1921
|
|
|
1921
1922
|
// 执行事件处理函数
|
|
1922
|
-
|
|
1923
|
+
let result = await obj.func.apply(obj, ctx.params);
|
|
1923
1924
|
results.push(result);
|
|
1924
1925
|
ctx.results.push(result);
|
|
1925
1926
|
|
|
@@ -1961,7 +1962,7 @@ Eventer.prototype._handleChainError = function (e, obj, ctx, results) {
|
|
|
1961
1962
|
* @returns {Promise<object>} 返回包含results和cancel方法的对象
|
|
1962
1963
|
*/
|
|
1963
1964
|
Eventer.prototype.runParallel = async function (key, ...params) {
|
|
1964
|
-
|
|
1965
|
+
let result = await this._execute(key, {
|
|
1965
1966
|
exec_mode: 'parallel',
|
|
1966
1967
|
options: params.options
|
|
1967
1968
|
}, ...params);
|
|
@@ -1981,7 +1982,7 @@ Eventer.prototype.runParallel = async function (key, ...params) {
|
|
|
1981
1982
|
*/
|
|
1982
1983
|
Eventer.prototype.emitParallel = function (key, ...params) {
|
|
1983
1984
|
// 内部调用 _execute 方法,但不等待结果
|
|
1984
|
-
|
|
1985
|
+
let result = this._execute(key, {
|
|
1985
1986
|
exec_mode: 'parallel',
|
|
1986
1987
|
options: params.options
|
|
1987
1988
|
}, ...params);
|
|
@@ -2000,7 +2001,7 @@ Eventer.prototype.emitParallel = function (key, ...params) {
|
|
|
2000
2001
|
* @param {number} max_listeners 最大监听器数量
|
|
2001
2002
|
* @returns {Eventer} 返回当前实例,支持链式调用
|
|
2002
2003
|
*/
|
|
2003
|
-
Eventer.prototype.setMaxListeners = function (
|
|
2004
|
+
Eventer.prototype.setMaxListeners = function (max_list) {
|
|
2004
2005
|
if (typeof max_listeners !== 'number' || max_listeners < 0) {
|
|
2005
2006
|
throw new Error('最大监听器数量必须是一个非负数');
|
|
2006
2007
|
}
|
|
@@ -2018,7 +2019,7 @@ Eventer.prototype.onMany = function (events_map) {
|
|
|
2018
2019
|
throw new Error('事件对象必须是一个非空对象');
|
|
2019
2020
|
}
|
|
2020
2021
|
|
|
2021
|
-
for (
|
|
2022
|
+
for (let event_name in events_map) {
|
|
2022
2023
|
if (events_map.has_own_property(event_name)) {
|
|
2023
2024
|
this.on(event_name, events_map[event_name]);
|
|
2024
2025
|
}
|
|
@@ -2035,11 +2036,11 @@ Eventer.prototype.onMany = function (events_map) {
|
|
|
2035
2036
|
* @private
|
|
2036
2037
|
*/
|
|
2037
2038
|
Eventer.prototype._parseKey = function (key) {
|
|
2038
|
-
|
|
2039
|
+
let parts = key.split(':');
|
|
2039
2040
|
if (parts.length === 1) {
|
|
2040
2041
|
// 没有命名空间,使用默认命名空间
|
|
2041
2042
|
return {
|
|
2042
|
-
namespace: this.config.
|
|
2043
|
+
namespace: this.config.default_name,
|
|
2043
2044
|
key: key
|
|
2044
2045
|
};
|
|
2045
2046
|
} else if (parts.length === 2) {
|
|
@@ -2202,14 +2203,14 @@ Eventer.prototype._throttle = function (func, limit) {
|
|
|
2202
2203
|
let last_func;
|
|
2203
2204
|
let last_time = 0;
|
|
2204
2205
|
return function () {
|
|
2205
|
-
|
|
2206
|
-
|
|
2206
|
+
let ctx = this;
|
|
2207
|
+
let args = arguments;
|
|
2207
2208
|
if (!last_time) {
|
|
2208
2209
|
func.apply(ctx, args);
|
|
2209
2210
|
last_time = Date.now();
|
|
2210
2211
|
} else {
|
|
2211
2212
|
clearTimeout(last_func);
|
|
2212
|
-
last_func = setTimeout(
|
|
2213
|
+
last_func = setTimeout(() => {
|
|
2213
2214
|
if ((Date.now() - last_time) >= limit) {
|
|
2214
2215
|
func.apply(ctx, args);
|
|
2215
2216
|
last_time = Date.now();
|
|
@@ -2229,10 +2230,10 @@ Eventer.prototype._throttle = function (func, limit) {
|
|
|
2229
2230
|
Eventer.prototype._debounce = function (func, wait) {
|
|
2230
2231
|
let timeout;
|
|
2231
2232
|
return function () {
|
|
2232
|
-
|
|
2233
|
-
|
|
2233
|
+
let ctx = this;
|
|
2234
|
+
let args = arguments;
|
|
2234
2235
|
clearTimeout(timeout);
|
|
2235
|
-
timeout = setTimeout(
|
|
2236
|
+
timeout = setTimeout(() => {
|
|
2236
2237
|
func.apply(ctx, args);
|
|
2237
2238
|
}, wait);
|
|
2238
2239
|
};
|
|
@@ -2255,10 +2256,10 @@ Eventer.prototype.pause = function (key = '') {
|
|
|
2255
2256
|
}
|
|
2256
2257
|
|
|
2257
2258
|
// 解析关键字
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2259
|
+
let parsed = this._parseKey(key);
|
|
2260
|
+
let namespace = parsed.namespace;
|
|
2261
|
+
let event_key = parsed.key;
|
|
2262
|
+
let full_key = `${namespace}:${event_key}`;
|
|
2262
2263
|
|
|
2263
2264
|
if (key) {
|
|
2264
2265
|
return this._pauseEvent(full_key);
|
|
@@ -2313,10 +2314,10 @@ Eventer.prototype.resume = function (key = '') {
|
|
|
2313
2314
|
}
|
|
2314
2315
|
|
|
2315
2316
|
// 解析关键字
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2317
|
+
let parsed = this._parseKey(key);
|
|
2318
|
+
let namespace = parsed.namespace;
|
|
2319
|
+
let event_key = parsed.key;
|
|
2320
|
+
let full_key = `${namespace}:${event_key}`;
|
|
2320
2321
|
|
|
2321
2322
|
if (key) {
|
|
2322
2323
|
return this._resumeEvent(full_key);
|
|
@@ -2371,10 +2372,10 @@ Eventer.prototype.isPaused = function (key) {
|
|
|
2371
2372
|
}
|
|
2372
2373
|
|
|
2373
2374
|
// 解析关键字
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2375
|
+
let parsed = this._parseKey(key);
|
|
2376
|
+
let namespace = parsed.namespace;
|
|
2377
|
+
let event_key = parsed.key;
|
|
2378
|
+
let full_key = `${namespace}:${event_key}`;
|
|
2378
2379
|
|
|
2379
2380
|
// 命名空间暂停检查
|
|
2380
2381
|
if (this._paused_namespace.has(namespace)) {
|
|
@@ -2397,7 +2398,7 @@ Eventer.prototype.getPausedStatus = function () {
|
|
|
2397
2398
|
return {
|
|
2398
2399
|
global_paused: this._paused_global,
|
|
2399
2400
|
paused_events: Array.from(this._paused),
|
|
2400
|
-
paused_namespaces: Array.from(this._paused_namespace)
|
|
2401
|
+
paused_namespaces: Array.from(this._paused_namespace), // eslint-disable-line mm_eslint/variable-name
|
|
2401
2402
|
};
|
|
2402
2403
|
};
|
|
2403
2404
|
|