Skip to content

Commit f8c0ea1

Browse files
committed
Implement AsyncEventEmitter
1 parent 074dbd7 commit f8c0ea1

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

JavaScript/c-async.js

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
'use strict';
2+
3+
class AsyncEventEmitter {
4+
constructor() {
5+
this.events = new Map();
6+
this.wrappers = new Map();
7+
}
8+
9+
on(name, fn) {
10+
const event = this.events.get(name);
11+
if (event) event.add(fn);
12+
else this.events.set(name, new Set([fn]));
13+
}
14+
15+
once(name, fn) {
16+
const wrapper = (...args) => {
17+
this.remove(name, wrapper);
18+
fn(...args);
19+
};
20+
this.wrappers.set(fn, wrapper);
21+
this.on(name, wrapper);
22+
}
23+
24+
async emit(name, ...args) {
25+
const event = this.events.get(name);
26+
if (!event) return;
27+
const promises = [...event.values()].map(fn => fn(...args));
28+
return Promise.all(promises);
29+
}
30+
31+
remove(name, fn) {
32+
const event = this.events.get(name);
33+
if (!event) return;
34+
if (event.has(fn)) {
35+
event.delete(fn);
36+
return;
37+
}
38+
const wrapper = this.wrappers.get(fn);
39+
if (wrapper) {
40+
event.delete(wrapper);
41+
if (event.size === 0) this.events.delete(name);
42+
}
43+
}
44+
45+
clear(name) {
46+
if (name) this.events.delete(name);
47+
else this.events.clear();
48+
}
49+
50+
count(name) {
51+
const event = this.events.get(name);
52+
return event ? event.size : 0;
53+
}
54+
55+
listeners(name) {
56+
const event = this.events.get(name);
57+
return new Set(event);
58+
}
59+
60+
names() {
61+
return [...this.events.keys()];
62+
}
63+
}
64+
65+
// Usage
66+
67+
const ee = new AsyncEventEmitter();
68+
69+
(async () => {
70+
71+
ee.on('e1', async () => {
72+
console.log('e1 listener 1');
73+
});
74+
75+
ee.on('e1', async () => {
76+
console.log('e1 listener 2');
77+
});
78+
79+
ee.on('e1', async () => {
80+
console.log('e1 listener 3');
81+
});
82+
83+
ee.on('e2', async () => {
84+
console.log('e2 listener 1');
85+
});
86+
87+
ee.on('e2', async () => {
88+
console.log('e2 listener 2');
89+
});
90+
91+
console.log('begin');
92+
await ee.emit('e1');
93+
await ee.emit('e2');
94+
console.log('end');
95+
96+
})();

0 commit comments

Comments
 (0)