Skip to content

Commit 08de125

Browse files
committed
feat: add getListeners and tag option
1 parent 4e0f6c3 commit 08de125

4 files changed

Lines changed: 140 additions & 5 deletions

File tree

docs/zh/guide/use/devTools.md

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
# 调试工具
1+
# 调试与诊断
22

3-
`FastEvent` 提供了调试工具,可以在`Redux DevTools`中查看触发的事件、监听器数量等信息。
43

5-
## 安装和使用步骤
4+
## 调试插件
5+
6+
`FastEvent` 提供了调试工具,可以在`Redux DevTools`中查看触发的事件、监听器数量等信息。
67

78
### 第 1 步:安装 Redux DevTools
89

@@ -43,3 +44,70 @@ const emitter = new FastEvent({
4344
每次事件触发时,你都可以在`Redux DevTools`中看到详细的状态变化信息,这对于调试和理解应用的事件流非常有帮助。
4445

4546
![](./devtools.png)
47+
48+
49+
## 监听信息
50+
51+
`FastEvent`还提供了一些辅助机制来帮助调试。
52+
53+
- **获取事件监听器元数据**
54+
55+
```ts
56+
import { FastEvent } from 'fastevent';
57+
const emitter = new FastEvent();
58+
59+
const listener1 = () => {}
60+
const listener2 = () => {}
61+
const listener3 = () => {}
62+
63+
emitter.on('test', listener1)
64+
emitter.on('test', listener2,{count: 10})
65+
emitter.once('test', listener3)
66+
67+
const metas = emitter.getListeners('test'); // [!code ++]
68+
console.log(metas);
69+
// [[listener1,0,0],[listener2,10,0],[listener3,0,1]]
70+
71+
72+
```
73+
74+
- `getListeners`方法用于获取事件监听器元数据,返回监听器注册信息`FastListenerMeta`
75+
76+
```ts
77+
type FastListenerMeta = [TypedFastEventListener<any, any>, number, number, string?]
78+
```
79+
80+
`FastListenerMeta`是一个数组,包含以下信息:
81+
| 位置 | 类型 | 说明 |
82+
| --- | --- | --- |
83+
| `0` | `TypedFastEventListener` | 监听器函数 |
84+
| `1` | `number` | 监听器调用限制次数,`0`表示无限制,`1`代表只调用一次 |
85+
| `2` | `number` | 监听器实际执行的次数,当达到限制次数后,监听器将被移除 |
86+
| `3` | `string` | 额外的信息,用于标识监听器 |
87+
88+
89+
- **事件监听器标签**
90+
91+
使用`getListeners`方法获取监听器元数据时,有时无法获取监听函数的更详细信息。
92+
此时,你可以为监听器添加额外的标签,用于标识监听器。
93+
94+
95+
```ts
96+
import { FastEvent } from 'fastevent';
97+
const emitter = new FastEvent();
98+
99+
const listener = () => {}
100+
101+
emitter.on('test', listener, {
102+
tag: 'modulex' //[!code ++]
103+
})
104+
105+
const metas = emitter.getListeners('test'); // [!code ++]
106+
console.log(metas);
107+
// [[listener,0,0,modulex]] // [!code ++]
108+
109+
```
110+
111+
:::warning 提示
112+
通过`FastEvent.listeners`可以查看所有的监听器注册信息。
113+
:::
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { describe, test, expect } from "vitest"
2+
import { FastEvent } from "../event"
3+
4+
describe("监听器元数据", async () => {
5+
test("获取指定事件的注册元信息", () => {
6+
const emitter = new FastEvent()
7+
const events: string[] = []
8+
emitter.on("x", ({ type }) => {
9+
events.push(type)
10+
})
11+
emitter.on("x", ({ type }) => {
12+
events.push(type)
13+
}, { count: 2 })
14+
15+
const metas = emitter.getListeners("x")
16+
17+
expect(metas[0][1]).toBe(0)
18+
expect(metas[0][2]).toBe(0)
19+
expect(metas[1][1]).toBe(2)
20+
expect(metas[1][2]).toBe(0)
21+
})
22+
23+
test("触发事件时提供额外的tag", () => {
24+
const emitter = new FastEvent()
25+
const events: string[] = []
26+
emitter.on("x", ({ type }) => {
27+
events.push(type)
28+
}, { tag: "a" })
29+
emitter.on("x", ({ type }) => {
30+
events.push(type)
31+
}, { count: 2, tag: "b" })
32+
33+
const metas = emitter.getListeners("x")
34+
35+
expect(metas[0][1]).toBe(0)
36+
expect(metas[0][2]).toBe(0)
37+
expect(metas[0][3]).toBe('a')
38+
expect(metas[1][1]).toBe(2)
39+
expect(metas[1][2]).toBe(0)
40+
expect(metas[1][3]).toBe('b')
41+
})
42+
})

packages/native/src/event.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ export class FastEvent<
134134
let index: number = 0
135135
const node = this._forEachNodes(parts, (node) => {
136136
const newListener = [listener, count, 0] as unknown as FastListenerMeta
137+
if (options.tag) newListener.push(options.tag)
137138
if (prepend) {
138139
node.__listeners.splice(0, 0, newListener)
139140
index = 0
@@ -762,6 +763,16 @@ export class FastEvent<
762763
}
763764
return results
764765
}
766+
767+
getListeners(type: keyof AllEvents): FastListenerMeta[]
768+
getListeners(type: string): FastListenerMeta[] {
769+
const nodes: FastListenerNode[] = []
770+
const parts = type.split(this._delimiter);
771+
this._traverseToPath(this.listeners, parts, (node) => {
772+
nodes.push(node)
773+
})
774+
return nodes[0].__listeners
775+
}
765776
/**
766777
* 异步触发事件
767778
* @param type - 事件类型,可以是字符串或预定义的事件类型

packages/native/src/types.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,14 @@ export type FastEventListener<
100100

101101

102102
/**
103-
* [监听器函数引用,需要执行多少次,实际执行的次数(用于负载均衡时记录)]
103+
* [
104+
* 监听器函数引用,
105+
* 需要执行多少次, =0代表不限
106+
* 实际执行的次数(用于负载均衡时记录)
107+
* 标签 用于调试一般可以标识监听器类型或任意信息
108+
* ]
104109
*/
105-
export type FastListenerMeta = [TypedFastEventListener<any, any>, number, number]
110+
export type FastListenerMeta = [TypedFastEventListener<any, any>, number, number, string?]
106111

107112
export type FastListenerNode = {
108113
__listeners: FastListenerMeta[];
@@ -201,6 +206,15 @@ export type FastEventListenOptions<
201206
off?: (message: TypedFastEventMessage<Events, Meta>, args: FastEventListenerArgs<Meta>) => boolean
202207
// 对监听器函数进行包装装饰,返回包装后的函数
203208
pipes?: FastListenerPipe[]
209+
/**
210+
* 为监听器添加一个tag,在监听器注册表中记录,用于调试使用
211+
*
212+
* emitter.on(type,listener,{tag:"x"})
213+
*
214+
* emitter.getListeners(tag)
215+
*
216+
*/
217+
tag?: string
204218
}
205219

206220

0 commit comments

Comments
 (0)