Skip to content

Commit 074dbd7

Browse files
committed
EventEmitter class
1 parent adbd63a commit 074dbd7

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

JavaScript/b-class.js

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
'use strict';
2+
3+
class EventEmitter {
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+
emit(name, ...args) {
25+
const event = this.events.get(name);
26+
if (!event) return;
27+
for (const fn of event.values()) {
28+
fn(...args);
29+
}
30+
}
31+
32+
remove(name, fn) {
33+
const event = this.events.get(name);
34+
if (!event) return;
35+
if (event.has(fn)) {
36+
event.delete(fn);
37+
return;
38+
}
39+
const wrapper = this.wrappers.get(fn);
40+
if (wrapper) {
41+
event.delete(wrapper);
42+
if (event.size === 0) this.events.delete(name);
43+
}
44+
}
45+
46+
clear(name) {
47+
if (name) this.events.delete(name);
48+
else this.events.clear();
49+
}
50+
51+
count(name) {
52+
const event = this.events.get(name);
53+
return event ? event.size : 0;
54+
}
55+
56+
listeners(name) {
57+
const event = this.events.get(name);
58+
return new Set(event);
59+
}
60+
61+
names() {
62+
return [...this.events.keys()];
63+
}
64+
}
65+
66+
// Usage
67+
68+
const ee = new EventEmitter();
69+
70+
// on and emit
71+
72+
ee.on('e1', data => {
73+
console.dir(data);
74+
});
75+
76+
ee.emit('e1', { msg: 'e1 ok' });
77+
78+
// once
79+
80+
ee.once('e2', data => {
81+
console.dir(data);
82+
});
83+
84+
ee.emit('e2', { msg: 'e2 ok' });
85+
ee.emit('e2', { msg: 'e2 not ok' });
86+
87+
// remove
88+
89+
const f3 = data => {
90+
console.dir(data);
91+
};
92+
93+
ee.on('e3', f3);
94+
ee.remove('e3', f3);
95+
ee.emit('e3', { msg: 'e3 not ok' });
96+
97+
// count
98+
99+
ee.on('e4', () => {});
100+
ee.on('e4', () => {});
101+
console.log('e4 count', ee.count('e4'));
102+
103+
// clear
104+
105+
ee.clear('e4');
106+
ee.emit('e4', { msg: 'e4 not ok' });
107+
ee.emit('e1', { msg: 'e1 ok' });
108+
109+
ee.clear();
110+
ee.emit('e1', { msg: 'e1 not ok' });
111+
112+
// listeners and names
113+
114+
ee.on('e5', () => {});
115+
ee.on('e5', () => {});
116+
ee.on('e6', () => {});
117+
ee.on('e7', () => {});
118+
119+
console.log('listeners', ee.listeners('e5'));
120+
console.log('names', ee.names());

0 commit comments

Comments
 (0)