events-ex 2.1.1 → 2.3.0
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/CHANGELOG.md +20 -0
- package/README.cn.md +119 -170
- package/README.md +140 -150
- package/docs/README.md +143 -149
- package/docs/all-off/README.md +17 -0
- package/docs/all-off/functions/allOff.md +33 -0
- package/docs/consts/README.md +12 -0
- package/docs/consts/variables/RegExpEventSymbol.md +11 -0
- package/docs/consts/variables/states.md +29 -0
- package/docs/default-methods/README.md +17 -0
- package/docs/default-methods/functions/getEventableMethods.md +309 -0
- package/docs/event/README.md +17 -0
- package/docs/event/classes/Event.md +143 -0
- package/docs/event-emitter/README-1.md +17 -0
- package/docs/event-emitter/README.md +17 -0
- package/docs/event-emitter/classes/EventEmitter-1.md +29 -0
- package/docs/event-emitter/classes/EventEmitter.md +369 -0
- package/docs/eventable/README.md +17 -0
- package/docs/eventable/functions/eventable.md +82 -0
- package/docs/has-listeners/README.md +17 -0
- package/docs/has-listeners/functions/hasListeners.md +38 -0
- package/docs/index/README.md +85 -0
- package/docs/modules.md +24 -23
- package/docs/pipe/README.md +17 -0
- package/docs/pipe/functions/pipe.md +41 -0
- package/docs/pipe-async/README.md +17 -0
- package/docs/pipe-async/functions/pipeAsync.md +41 -0
- package/docs/unify/README.md +17 -0
- package/docs/unify/functions/unify.md +35 -0
- package/docs/util/array-remove/README.md +17 -0
- package/docs/util/array-remove/functions/remove.md +21 -0
- package/docs/util/object-for-each/README.md +17 -0
- package/docs/util/object-for-each/functions/forEach.md +29 -0
- package/docs/util/promise-any/README.md +11 -0
- package/docs/util/promise-any/variables/default.md +9 -0
- package/docs/util/string-pad/README.md +17 -0
- package/docs/util/string-pad/functions/pad.md +25 -0
- package/docs/util/to-int/README.md +17 -0
- package/docs/util/to-int/functions/toInt.md +21 -0
- package/docs/util/valid-callable/README.md +17 -0
- package/docs/util/valid-callable/functions/validCallable.md +21 -0
- package/docs/util/valid-object/README.md +17 -0
- package/docs/util/valid-object/functions/validObject.md +21 -0
- package/docs/wrap-event-emitter/README.md +21 -0
- package/docs/wrap-event-emitter/functions/wrapEventEmitter.md +33 -0
- package/docs/wrap-event-emitter/variables/methods.md +11 -0
- package/lib/all-off.d.ts +1 -1
- package/lib/all-off.js +1 -1
- package/lib/default-methods.d.ts +38 -7
- package/lib/default-methods.js +155 -32
- package/lib/event-emitter.d.ts +12 -2
- package/lib/event.d.ts +9 -3
- package/lib/event.js +6 -0
- package/lib/eventable.js +4 -1
- package/lib/pipe-async.d.ts +4 -1
- package/lib/pipe-async.js +39 -5
- package/lib/pipe.d.ts +1 -1
- package/lib/pipe.js +1 -1
- package/lib/unify.d.ts +1 -1
- package/lib/unify.js +1 -1
- package/lib/util/array-remove.js +1 -1
- package/lib/util/object-for-each.js +1 -1
- package/lib/util/promise-any.d.ts +1 -0
- package/lib/util/promise-any.js +44 -0
- package/lib/util/string-pad.js +1 -1
- package/lib/wrap-event-emitter.d.ts +2 -1
- package/lib/wrap-event-emitter.js +24 -3
- package/package.json +17 -17
- package/src/default-methods.js +159 -26
- package/src/event-emitter.d.ts +12 -2
- package/src/event.js +6 -0
- package/src/eventable.js +3 -0
- package/src/pipe-async.js +64 -30
- package/src/util/promise-any.js +45 -0
- package/src/wrap-event-emitter.js +23 -18
- package/docs/.nojekyll +0 -1
- package/docs/classes/event.Event.md +0 -141
- package/docs/classes/event_emitter-1.EventEmitter.md +0 -29
- package/docs/classes/event_emitter.EventEmitter.md +0 -352
- package/docs/modules/all_off.md +0 -44
- package/docs/modules/consts.md +0 -39
- package/docs/modules/default_methods.md +0 -51
- package/docs/modules/event.md +0 -19
- package/docs/modules/event_emitter-1.md +0 -19
- package/docs/modules/event_emitter.md +0 -19
- package/docs/modules/eventable.md +0 -92
- package/docs/modules/has_listeners.md +0 -49
- package/docs/modules/index.md +0 -99
- package/docs/modules/pipe.md +0 -49
- package/docs/modules/pipe_async.md +0 -49
- package/docs/modules/unify.md +0 -46
- package/docs/modules/util_array_remove.md +0 -39
- package/docs/modules/util_object_for_each.md +0 -41
- package/docs/modules/util_string_pad.md +0 -40
- package/docs/modules/util_to_int.md +0 -39
- package/docs/modules/util_valid_callable.md +0 -39
- package/docs/modules/util_valid_object.md +0 -39
- package/docs/modules/wrap_event_emitter.md +0 -57
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
## [2.3.0](https://github.com/snowyu/events-ex.js/compare/v2.2.0...v2.3.0) (2026-04-17)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* support special index values 'first' and 'last' for listener ordering ([53cfb5b](https://github.com/snowyu/events-ex.js/commit/53cfb5bb3f7229cb549e99d410c0d6d39665eb0a))
|
|
11
|
+
|
|
12
|
+
## [2.3.0](https://github.com/snowyu/events-ex.js/compare/v2.2.0...v2.3.0) (2025-05-15)
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* **index:** support special index values 'first' and 'last' in on/once methods to maintain regional ordering.
|
|
17
|
+
|
|
18
|
+
## [2.2.0](https://github.com/snowyu/events-ex.js/compare/v2.1.1...v2.2.0) (2026-03-10)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Features
|
|
22
|
+
|
|
23
|
+
* enhance async event emission with parallel execution and result aggregation ([888e944](https://github.com/snowyu/events-ex.js/commit/888e944ce02d1b10248a710712048a8ee0216928))
|
|
24
|
+
|
|
5
25
|
## [2.1.1](https://github.com/snowyu/events-ex.js/compare/v2.1.0...v2.1.1) (2025-10-24)
|
|
6
26
|
|
|
7
27
|
|
package/README.cn.md
CHANGED
|
@@ -4,98 +4,90 @@
|
|
|
4
4
|
|
|
5
5
|
### Features
|
|
6
6
|
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
7
|
+
* **模块化 Event-able 能力**:通过 `eventable(MyClass)` 将事件功能注入任何类,无需强制继承。
|
|
8
|
+
* **核心事件增强**:
|
|
9
|
+
* **冒泡与中断**:全面支持事件传播控制及中途取消。
|
|
10
|
+
* **监听器排序**:通过 `on()` 和 `once()` 的可选 `index` 参数精确控制执行顺序。支持特殊值 `'first'` 和 `'last'` 以确保监听器始终保持在边界。
|
|
11
|
+
* **正则表达式订阅**:支持使用正则表达式订阅多个匹配的事件。
|
|
12
|
+
* **可挂载(Hook-able)系统**:允许在核心层面拦截并修改事件行为。
|
|
13
|
+
* **高级异步特性 (仅针对 `emitAsync`)**:
|
|
14
|
+
* **可配置的并发性**:异步监听器支持 **顺序(Serial)**(默认)和 **并发(Parallel)** 执行。
|
|
15
|
+
* **结果聚合策略**:支持多种收集返回值的方式:`last`(默认)、`first`(首个成功结果)和 `collect`(所有结果)。
|
|
16
|
+
* **Fluent API 代理**:通过 `.parallel()` 和 `.configure()` 提供无副作用的临时执行上下文。
|
|
17
|
+
* **架构优势**:重写核心以提升性能与灵活性,同时保持广泛的兼容性。
|
|
18
|
+
* **事件工具集**:内置支持 `pipe`, `pipeAsync`, `unify`, `allOff` 和 `hasListeners`。
|
|
13
19
|
|
|
14
20
|
### 区别
|
|
15
21
|
|
|
16
|
-
*
|
|
22
|
+
* **与 [Node 事件模块](https://nodejs.org/api/events.html) 的区别**
|
|
17
23
|
* 🔁 **`改变`**: 事件支持冒泡机制与中断
|
|
18
24
|
* 事件对象(`Event Object`)作为监听器的 "this" 对象。
|
|
19
25
|
* `result` 属性: 可选, 如果设置,则将该结果返回到事件发射器(`Event Emitter`)。
|
|
20
26
|
* `stopped` 属性: 可选, 如果设置为 `true`,则会阻止剩余的监听器被执行。
|
|
21
27
|
* `target`属性: 事件发射器对象,原本的`this`
|
|
22
28
|
* `type`属性: 触发的事件类型名称
|
|
29
|
+
* `resolved`: (仅异步) 在 `first` 模式下,标识是否已找到成功的结果。
|
|
23
30
|
* **`改变`**: `emit` 方法返回监听器回调函数的结果而不是成功状态。
|
|
24
31
|
* **`改变`**: 监听器回调函数的 `this` 对象是 `Event Object` 事件对象而不是事件发射器对象。
|
|
25
32
|
* 事件发射器对象被放入 `Event` 对象的 `target` 属性中。
|
|
26
|
-
* ⚡
|
|
27
|
-
*
|
|
28
|
-
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
|
|
32
|
-
*
|
|
33
|
-
|
|
34
|
-
*
|
|
35
|
-
|
|
33
|
+
* ⚡ **增强的 `emitAsync` 方法 (异步专用)**:
|
|
34
|
+
* **顺序模式 (Serial)**: 逐个执行监听器,尊重 `this.stopped` 中断(默认)。
|
|
35
|
+
* **并发模式 (Parallel)**: 同时执行所有监听器。
|
|
36
|
+
* **结果策略**:
|
|
37
|
+
* `last`: 返回最后一个(或最后完成的)监听器的结果。
|
|
38
|
+
* `first`: 返回第一个成功的非 undefined 结果(自动跳过错误)。
|
|
39
|
+
* `collect`: 按注册顺序以数组形式返回所有结果。
|
|
40
|
+
* **流式配置**: 使用 `.parallel()` 或 `.configure({...})` 进行单次定制化异步发射。
|
|
41
|
+
* **事件监听器 API**: `on/once(event: string|RegExp, listener, index?: number|'first'|'last')`
|
|
42
|
+
* 📌 **Index 参数** (可选): 在监听器数组中指定插入位置。
|
|
43
|
+
* `'first'` (`-Infinity`): 始终保持在 **Head** 区。先注册的 `'first'` 监听器排在最前面。
|
|
44
|
+
* `'last'` (`Infinity`): 始终保持在 **Tail** 区。先注册为 `'last'` 的监听器将始终位于数组的绝对末尾。
|
|
45
|
+
* `number`: 常规 **Body** 区内的相对索引。
|
|
46
|
+
* 🧪 **正则事件匹配**: 允许使用正则表达式绑定多个相关事件。
|
|
47
|
+
|
|
48
|
+
* **与 [event-emitter](https://github.com/medikoo/event-emitter) 的区别**
|
|
49
|
+
* **`改变`**: 事件支持冒泡机制(如上所述)。
|
|
36
50
|
* 添加了默认最大监听器数量的类属性,以保持与 Node 事件模块的兼容性。
|
|
37
51
|
* 添加了 `setMaxListeners` 方法,以保持与 Node 事件模块的兼容性。
|
|
38
52
|
* 添加了 `error`、`newListener` 和 `removeListener` 事件,以保持与 Node 事件模块的兼容性。
|
|
39
53
|
* 添加了 `listeners()` 方法,以保持与 Node 事件模块的兼容性。
|
|
40
54
|
* 添加了 `listenerCount()` 类方法,以保持与 Node 事件模块的兼容性。
|
|
41
|
-
* 添加了`emitAsync
|
|
42
|
-
* 🔗 事件管道与统一:pipe() 与 unify()
|
|
43
|
-
* `pipe(source, target)`:将一个 emitter 的事件转发到另一个 emitter。
|
|
44
|
-
* `unify(emitter1, emitter2)`:双向同步事件流,适用于构建共享状态或通信桥梁。
|
|
45
|
-
* 📦 丰富的工具函数
|
|
46
|
-
* 提供如 `allOff()`, `hasListeners()`, `listenerCount()` 等辅助函数,便于调试与管理事件生命周期。
|
|
47
|
-
* 有助于构建更健壮的事件驱动系统。
|
|
48
|
-
* 🔌 模块化能力注入:`eventable()`
|
|
49
|
-
* 不必继承基类,可通过 eventable(MyClass) 将事件能力注入任意类。
|
|
50
|
-
* 支持配置只注入特定方法,避免污染原型链。
|
|
51
|
-
|
|
52
|
-
注意: 事件内部引发错误不会中断通知,但是会在通知结束时 emit 错误事件(`emit('error', error, 'notify', eventName, listener, args)`)
|
|
53
|
-
|
|
54
|
-
### 安装
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
npm install events-ex@alpha
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### 用法
|
|
61
|
-
|
|
62
|
-
直接继承使用 `EventEmitter` 类
|
|
55
|
+
* 添加了`emitAsync`等方法,支持异步事件
|
|
63
56
|
|
|
64
|
-
|
|
65
|
-
import {EventEmitter} from 'events-ex';
|
|
57
|
+
---
|
|
66
58
|
|
|
67
|
-
|
|
68
|
-
```
|
|
59
|
+
### 用法
|
|
69
60
|
|
|
70
|
-
|
|
61
|
+
#### 核心特性:监听器排序 (Index 参数)
|
|
71
62
|
|
|
72
63
|
```js
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
64
|
+
const ee = new EventEmitter();
|
|
65
|
+
ee.on('test', () => console.log('third'));
|
|
66
|
+
ee.on('test', () => console.log('first'), 'first'); // 始终在最前
|
|
67
|
+
ee.on('test', () => console.log('last'), 'last'); // 始终在最后
|
|
68
|
+
ee.on('test', () => console.log('second'), 1); // 常规区域索引 1 (相对于 Head)
|
|
69
|
+
|
|
70
|
+
ee.emit('test');
|
|
71
|
+
// 输出:
|
|
72
|
+
// first
|
|
73
|
+
// second
|
|
74
|
+
// third
|
|
75
|
+
// last
|
|
79
76
|
```
|
|
80
77
|
|
|
81
|
-
|
|
78
|
+
#### 核心特性:正则表达式订阅
|
|
82
79
|
|
|
83
80
|
```js
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
console.log('event occur');
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
my.on(/^event/, function() {
|
|
91
|
-
console.log('regexp match multi events');
|
|
81
|
+
const ee = new EventEmitter();
|
|
82
|
+
ee.on(/^user\..*/, function(data) {
|
|
83
|
+
console.log(`事件 ${this.type} 触发,数据:`, data);
|
|
92
84
|
});
|
|
93
85
|
|
|
94
|
-
|
|
95
|
-
|
|
86
|
+
ee.emit('user.login', { id: 1 });
|
|
87
|
+
ee.emit('user.logout', { id: 1 });
|
|
96
88
|
```
|
|
97
89
|
|
|
98
|
-
|
|
90
|
+
#### 核心特性:冒泡与中断示例
|
|
99
91
|
|
|
100
92
|
```js
|
|
101
93
|
import {EventEmitter, states} from 'events-ex';
|
|
@@ -103,7 +95,6 @@ import {isObject} from 'util-ex';
|
|
|
103
95
|
|
|
104
96
|
class MyDb extends EventEmitter {
|
|
105
97
|
get(key) {
|
|
106
|
-
// Demo the event object bubbling usage:
|
|
107
98
|
let result = this.emit('getting', key)
|
|
108
99
|
if(isObject(result)) {
|
|
109
100
|
if (result.state === states.ABORT) return
|
|
@@ -115,149 +106,107 @@ class MyDb extends EventEmitter {
|
|
|
115
106
|
|
|
116
107
|
let db = new MyDb
|
|
117
108
|
db.on('getting', function(key){
|
|
118
|
-
result = myGet(key);
|
|
109
|
+
let result = myGet(key);
|
|
119
110
|
if (result != null) {
|
|
120
|
-
|
|
121
|
-
this.
|
|
122
|
-
state: states.DONE,
|
|
123
|
-
result: result,
|
|
124
|
-
}
|
|
125
|
-
this.stopped = true // it will skip other listeners if true
|
|
111
|
+
this.result = { state: states.DONE, result: result }
|
|
112
|
+
this.stopped = true // 停止后续监听器执行
|
|
126
113
|
} else {
|
|
127
|
-
|
|
128
|
-
this.result = {state: states.ABORT};
|
|
129
|
-
// this.stopped = true // it will skip other listeners if true
|
|
114
|
+
this.result = { state: states.ABORT };
|
|
130
115
|
}
|
|
131
116
|
})
|
|
132
117
|
```
|
|
133
118
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
```javascript
|
|
137
|
-
|
|
138
|
-
import {wrapEventEmitter as ee} from 'events-ex';
|
|
139
|
-
|
|
140
|
-
class MyClass { /* .. */ };
|
|
141
|
-
ee(MyClass.prototype); // All instances of MyClass will expose event-emitter interface
|
|
119
|
+
#### 异步专用特性:并发与聚合
|
|
142
120
|
|
|
143
|
-
|
|
144
|
-
let listener;
|
|
121
|
+
这些特性**仅适用于** `emitAsync` 方法。
|
|
145
122
|
|
|
146
|
-
|
|
147
|
-
|
|
123
|
+
```js
|
|
124
|
+
const ee = new EventEmitter();
|
|
125
|
+
ee.on('task', async () => {
|
|
126
|
+
await sleep(100);
|
|
127
|
+
return '结果 1';
|
|
148
128
|
});
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
// … react to first 'test' event (invoked only once!)
|
|
129
|
+
ee.on('task', async () => {
|
|
130
|
+
return '结果 2';
|
|
152
131
|
});
|
|
153
132
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
emitter.off('test', listener); // Removed first listener
|
|
158
|
-
emitter.emit('test', arg1, arg2/*…args*/); // No listeners invoked
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### API
|
|
133
|
+
// 1. 默认 (串行):顺序执行,返回 '结果 2'
|
|
134
|
+
const res = await ee.emitAsync('task');
|
|
162
135
|
|
|
163
|
-
|
|
136
|
+
// 2. 并发 + 收集:并发执行,返回 ['结果 1', '结果 2']
|
|
137
|
+
const allResults = await ee.parallel('collect').emitAsync('task');
|
|
164
138
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
* `class`: the class to be injected the ability.
|
|
168
|
-
* `options` _(object)_: optional options
|
|
169
|
-
* `include` _(string[]|string)_: only these emitter methods will be added to the class
|
|
170
|
-
* **NOTE:** static method should use the prefix '@' with name.
|
|
171
|
-
* `exclude` _(string[]|string)_: theses emitter methods would not be added to the class
|
|
172
|
-
* **NOTE:** static method should use the prefix '@' with name.
|
|
173
|
-
* `methods` _(object)_: hooked methods to the class
|
|
174
|
-
* key: the method name to hook.
|
|
175
|
-
* value: the new method function
|
|
176
|
-
* use `this.super()` to call the original method.
|
|
177
|
-
* `this.self` is the original `this` object.
|
|
178
|
-
* `classMethods` _(object)_: hooked class methods to the class
|
|
179
|
-
|
|
180
|
-
```coffee
|
|
181
|
-
eventable = require('events-ex/eventable')
|
|
182
|
-
#OtherClass = require('OtherClass')
|
|
183
|
-
class OtherClass
|
|
184
|
-
exec: -> console.log "my original exec"
|
|
185
|
-
|
|
186
|
-
class MyClass
|
|
187
|
-
# only 'on', 'off', 'emit' and static methods 'listenerCount' added to the class
|
|
188
|
-
eventable MyClass, include: ['on', 'off', 'emit', '@listenerCount']
|
|
189
|
-
|
|
190
|
-
# add the eventable ability to OtherClass and inject the exec method of OtherClass.
|
|
191
|
-
eventable OtherClass, methods:
|
|
192
|
-
exec: ->
|
|
193
|
-
console.log "new exec"
|
|
194
|
-
@super() # call the original method
|
|
139
|
+
// 3. 并发 + 首个成功:并发执行,返回最快成功的 '结果 2'
|
|
140
|
+
const firstResult = await ee.parallel('first').emitAsync('task');
|
|
195
141
|
```
|
|
196
142
|
|
|
197
|
-
|
|
143
|
+
### 高级特性
|
|
198
144
|
|
|
199
|
-
|
|
145
|
+
#### 异步并发引擎 (仅针对 `emitAsync`)
|
|
200
146
|
|
|
201
|
-
|
|
147
|
+
| 选项 | 取值 | 说明 |
|
|
148
|
+
| :--- | :--- | :--- |
|
|
149
|
+
| **`asyncMode`** | `'serial'` | **(默认)** 监听器逐个运行。支持 `this.stopped` 中断。 |
|
|
150
|
+
| | `'parallel'` | 监听器并发运行。忽略 `this.stopped`。 |
|
|
151
|
+
| **`resultMode`** | `'last'` | **(默认)** 返回最后一个监听器的结果(并发模式下为最后一个完成的)。 |
|
|
152
|
+
| | `'first'` | 返回第一个 **非 undefined** 且 **成功** 的结果。自动跳过错误。 |
|
|
153
|
+
| | `'collect'` | 按注册顺序以数组形式返回所有监听器的结果。 |
|
|
202
154
|
|
|
203
|
-
####
|
|
155
|
+
#### 代理隔离 (Fluent API)
|
|
204
156
|
|
|
205
|
-
|
|
206
|
-
When `name` is provided, it checks listeners for specific event name
|
|
157
|
+
调用 `.parallel()` 或 `.configure()` 返回一个临时的代理对象 (`Object.create(this)`),确保并发场景下的线程安全和配置隔离。
|
|
207
158
|
|
|
208
|
-
|
|
209
|
-
var emitter = ee();
|
|
210
|
-
var hasListeners = require('events-ex/has-listeners');
|
|
211
|
-
var listener = function () {};
|
|
159
|
+
#### 安全注入 (AoP 兼容性) 与命名冲突
|
|
212
160
|
|
|
213
|
-
|
|
161
|
+
通过 `wrapEventEmitter(target)` 或 `eventable(MyClass)` 向现有对象或原型注入事件能力时,仅注入**最小方法集**以降低命名冲突风险:
|
|
214
162
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
hasListeners(emitter, 'bar'); // false
|
|
163
|
+
- `on`, `once`, `off`
|
|
164
|
+
- `emit`, `emitAsync`
|
|
165
|
+
- `setEmitterOptions`
|
|
219
166
|
|
|
220
|
-
|
|
221
|
-
hasListeners(emitter, 'foo'); // false
|
|
222
|
-
```
|
|
167
|
+
⚠️ **命名冲突警告**:如果您的目标对象已经拥有这些同名方法,它们将被覆盖。
|
|
223
168
|
|
|
224
|
-
|
|
169
|
+
**解决方案:方法重命名 (Rename)**
|
|
170
|
+
您可以利用 `eventable` 的 `rename` 选项将注入的方法映射为自定义名称:
|
|
225
171
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
172
|
+
```js
|
|
173
|
+
eventable(MyClass, {
|
|
174
|
+
rename: {
|
|
175
|
+
emitAsync: 'myEmitAsync',
|
|
176
|
+
on: 'addListener'
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
// 现在可以使用:inst.myEmitAsync('event')
|
|
180
|
+
```
|
|
229
181
|
|
|
230
|
-
|
|
182
|
+
**完整 EventEmitter 与 最小注入的区别**
|
|
231
183
|
|
|
232
|
-
|
|
233
|
-
|
|
184
|
+
- **独立实例**:在不传递 `target` 参数的情况下调用 `ee()` 或 `new EventEmitter()`,将返回包含所有高级方法(包括 `.parallel()`, `.configure()`, `.setMaxListeners()` 等)的**完整实例**。
|
|
185
|
+
- **注入模式**:向 `ee(target)` 传递目标对象或使用 `eventable` 时,会执行**最小化注入**以保持目标对象的原有精简结构。如果需要配置并行或聚合模式,请直接在目标对象上使用 `setEmitterOptions`。
|
|
234
186
|
|
|
235
|
-
|
|
236
|
-
var eeUnify = require('events-ex/unify');
|
|
187
|
+
---
|
|
237
188
|
|
|
238
|
-
|
|
239
|
-
var emitter2 = ee(), listener2, listener4;
|
|
189
|
+
### API
|
|
240
190
|
|
|
241
|
-
|
|
242
|
-
emitter2.on('test', listener2 = function () { });
|
|
191
|
+
#### eventable(class[, options]) _(events-ex/eventable)_
|
|
243
192
|
|
|
244
|
-
|
|
245
|
-
emitter2.emit('test'); // Invoked listener2
|
|
193
|
+
为类直接添加事件能力。
|
|
246
194
|
|
|
247
|
-
|
|
195
|
+
* `class`: 要注入能力的类。
|
|
196
|
+
* `options`: 可选参数
|
|
197
|
+
* `include/exclude`: 包含/排除特定方法。
|
|
198
|
+
* `emitterOptions`: 发射器的默认配置(如 `asyncMode`, `resultMode`)。
|
|
199
|
+
* `rename` _(object)_: 将注入的方法映射为自定义名称。
|
|
200
|
+
* 键:原始方法名(如 'on', 'emitAsync')。
|
|
201
|
+
* 值:重命名后的新名称。
|
|
248
202
|
|
|
249
|
-
|
|
250
|
-
emitter2.emit('test'); // Invoked listener1 and listener2
|
|
203
|
+
#### pipeAsync(source, target[, name, options]) _(events-ex/pipe-async)_
|
|
251
204
|
|
|
252
|
-
|
|
253
|
-
emitter2.on('test', listener4 = function () { });
|
|
205
|
+
创建异步管道。支持配置传播模式和结果聚合策略。
|
|
254
206
|
|
|
255
|
-
|
|
256
|
-
emitter2.emit('test'); // Invoked listener1, listener2, listener3 and listener4
|
|
257
|
-
```
|
|
207
|
+
#### setEmitterOptions(options)
|
|
258
208
|
|
|
209
|
+
配置实例级的默认选项。
|
|
259
210
|
|
|
260
211
|
[event-emitter]: https://github.com/medikoo/event-emitter
|
|
261
|
-
[Node Events]: https://nodejs.org/api/events.html
|
|
262
212
|
[Ability]: https://github.com/snowyu/custom-ability.js
|
|
263
|
-
|