Skip to content

Commit d13016d

Browse files
committed
Fix and improve AsyncEmitter
1 parent f7c603a commit d13016d

1 file changed

Lines changed: 28 additions & 8 deletions

File tree

JavaScript/c-async.js

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
class AsyncEventEmitter {
3+
class AsyncEmitter {
44
constructor() {
55
this.events = new Map();
66
this.wrappers = new Map();
@@ -16,12 +16,18 @@ class AsyncEventEmitter {
1616
}
1717

1818
once(name, fn) {
19+
if (fn === undefined) {
20+
return new Promise(resolve => {
21+
this.once(name, resolve);
22+
});
23+
}
1924
const wrapper = (...args) => {
2025
this.remove(name, wrapper);
2126
return fn(...args);
2227
};
2328
this.wrappers.set(fn, wrapper);
2429
this.on(name, wrapper);
30+
return undefined;
2531
}
2632

2733
async emit(name, ...args) {
@@ -33,17 +39,31 @@ class AsyncEventEmitter {
3339
}
3440

3541
remove(name, fn) {
36-
const event = this.events.get(name);
42+
const { events, wrappers } = this;
43+
const event = events.get(name);
3744
if (!event) return;
3845
if (event.has(fn)) event.delete(fn);
39-
const wrapper = this.wrappers.get(fn);
40-
if (wrapper) event.delete(wrapper);
41-
if (event.size === 0) this.events.delete(name);
46+
const wrapper = wrappers.get(fn);
47+
if (wrapper) {
48+
wrappers.delete(fn);
49+
event.delete(wrapper);
50+
}
51+
if (event.size === 0) events.delete(name);
4252
}
4353

4454
clear(name) {
45-
if (name) this.events.delete(name);
46-
else this.events.clear();
55+
const { events, wrappers } = this;
56+
if (!name) {
57+
events.clear();
58+
wrappers.clear();
59+
return;
60+
}
61+
const event = events.get(name);
62+
if (!event) return;
63+
for (const [fn, wrapper] of wrappers.entries()) {
64+
if (event.has(wrapper)) wrappers.delete(fn);
65+
}
66+
events.delete(name);
4767
}
4868

4969
count(name) {
@@ -63,7 +83,7 @@ class AsyncEventEmitter {
6383

6484
// Usage
6585

66-
const ee = new AsyncEventEmitter();
86+
const ee = new AsyncEmitter();
6787

6888
(async () => {
6989

0 commit comments

Comments
 (0)