Skip to content

Commit 44083a2

Browse files
committed
fix: 更新监听器执行计数的更新时机
1 parent 02a2c2d commit 44083a2

4 files changed

Lines changed: 37 additions & 30 deletions

File tree

.changeset/two-tools-guess.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
'fastevent': patch
33
---
44

5-
更新监听器执行计数的更新时机
5+
- **[修复]** 🐛 新监听器执行计数的更新时机

bun.lock

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"author": "zhangfisher",
2929
"license": "MIT",
3030
"devDependencies": {
31-
"@biomejs/biome": "1.9.4",
31+
"@biomejs/biome": "2.2.0",
3232
"@changesets/cli": "^2.28.1",
3333
"cpx": "^1.5.0",
3434
"turbo": "^2.5.2"

packages/native/src/event.ts

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -631,23 +631,30 @@ export class FastEvent<
631631
.map((listener, i) => [listener, i, node.__listeners] as [FastListenerMeta, number, FastListenerMeta[]]));
632632
}, []);
633633

634-
try {
635-
const executeor = this._getListenerExecutor(args)
636-
if (executeor) {
637-
const r = executeor(listeners.map(listener => listener[0]), message, args, this._executeListener.bind(this)) as any[]
638-
return Array.isArray(r) ? r : [r]
639-
} else {
640-
return listeners.map(listener => this._executeListener(listener[0][0], message, args, true))
641-
}
642-
} finally {
643-
// 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除
644-
for (let i = listeners.length - 1; i >= 0; i--) {
645-
const meta = listeners[i][0] as FastListenerMeta
646-
meta[2]++ // 实际执行的次数
647-
// =0不限执行次数,>0时代表执行次数限制
648-
if (meta[1] > 0 && meta[1] <= meta[2]) {
649-
listeners[i][2].splice(i, 1)
650-
}
634+
// 执行监听器前计数选减一,否则如果在监听器函数中再次触发时会导致重复执行。
635+
// 比如:在once('x')监听函数中执行再次emit('x')就会导致循环
636+
this._decListenerExecCount(listeners)
637+
638+
const executeor = this._getListenerExecutor(args)
639+
if (executeor) {
640+
const r = executeor(listeners.map(listener => listener[0]), message, args, this._executeListener.bind(this)) as any[]
641+
return Array.isArray(r) ? r : [r]
642+
} else {
643+
return listeners.map(listener => this._executeListener(listener[0][0], message, args, true))
644+
}
645+
}
646+
/**
647+
* 减少侦听器的执行次数
648+
* @param listeners
649+
*/
650+
_decListenerExecCount(listeners: [FastListenerMeta, number, FastListenerMeta[]][]){
651+
// 由于可能涉及到删除修改__listeners,所以需要倒序, 从后往前删除
652+
for (let i = listeners.length - 1; i >= 0; i--) {
653+
const meta = listeners[i][0] as FastListenerMeta
654+
meta[2]++ // 实际执行的次数
655+
// =0不限执行次数,>0时代表执行次数限制
656+
if (meta[1] > 0 && meta[1] <= meta[2]) {
657+
listeners[i][2].splice(i, 1)
651658
}
652659
}
653660
}

0 commit comments

Comments
 (0)