-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathevents.js
88 lines (75 loc) · 2.01 KB
/
events.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
class EventEmitter {
constructor() {
this._events = {};
}
addListener(eventName, listener) {
const events = this._events;
if (!events[eventName])
events[eventName] = [];
events[eventName].push(listener);
return this;
}
on(eventName, listener) {
return this.addListener(eventName, listener);
}
once(eventName, listener) {
return this.addListener(eventName, this._onceWrap(eventName, listener));
}
_onceWrap(eventName, listener) {
const state = { eventName, listener, wrapFn: null };
state.wrapFn = this._onceWrapper.bind(this, state);
state.wrapFn.listener = listener;
return state.wrapFn;
}
_onceWrapper({eventName, listener, wrapFn}, ...args) {
this.removeListener(eventName, wrapFn);
listener.apply(this, args);
}
emit(eventName, ...args) {
const events = this._events;
if (events[eventName]) {
const listeners = this._arrayClone(events[eventName]);
for (let i = 0; i < listeners.length; i++) {
listeners[i].apply(this, args);
}
} else {
return false;
}
return true;
}
_arrayClone(arr) {
return arr.map(v => v);
}
removeListener(eventName, listener) {
const events = this._events;
if (events[eventName]) {
for (let i = events[eventName].length - 1; i >= 0; i--) {
if (events[eventName][i] === listener || events[eventName][i].listener === listener) {
events[eventName].splice(i, 1);
break;
}
}
if (events[eventName].length === 0)
delete events[eventName];
}
return this;
}
off(eventName, listener) {
return this.removeListener(eventName, listener);
}
removeAllListeners(eventName) {
if (eventName === undefined) {
this._events = {};
return this;
}
delete this._events[eventName];
return this;
}
listenerCount(eventName) {
const events = this._events;
if (events[eventName])
return events[eventName].length
return 0;
}
}
module.exports = EventEmitter;