Skip to content

Commit 4d23e52

Browse files
committed
update event emitter
1 parent 671990a commit 4d23e52

File tree

2 files changed

+84
-29
lines changed

2 files changed

+84
-29
lines changed

js/array.js

+29-1
Original file line numberDiff line numberDiff line change
@@ -301,4 +301,32 @@ function mapConcatTest() {
301301
var target = [['a', 'b', 'c'], ['a', 'b']];
302302
console.log('\nmapConcatTest:\n', mapConcat(target));
303303
}
304-
mapConcatTest()
304+
// mapConcatTest();
305+
306+
307+
// 求整数数组的最大子串和,如 [-23, 17, -7, 11, -2, 1, -34] 的最大子串和是21,对应子串是 [17, -7, 11]
308+
function maxSeqSum(arr) {
309+
if (!Array.isArray(arr)) {
310+
return null;
311+
}
312+
const len = arr.length;
313+
let maxSum = arr[0];
314+
let seqSum = arr[0];
315+
for (let i = 1; i < len; i++) {
316+
if (seqSum <= 0) {
317+
seqSum = arr[i];
318+
} else {
319+
seqSum += arr[i];
320+
}
321+
if (seqSum > maxSum) {
322+
maxSum = seqSum;
323+
}
324+
}
325+
return maxSum;
326+
}
327+
function maxSeqSumTest() {
328+
console.log(maxSeqSum([-23, 17, -7, 11, -2, 1, -34]));
329+
console.log(maxSeqSum([1, -2, 3, 10, -4, 7, 2, -5]));
330+
console.log(maxSeqSum([-1]));
331+
}
332+
// maxSeqSumTest();

js/event.js

+55-28
Original file line numberDiff line numberDiff line change
@@ -5,56 +5,83 @@
55
* @description : 一个简单的观察者模式事件系统实现
66
*/
77

8-
function EventHandle() {
9-
var events = {};
10-
this.on = function(event, callback) {
11-
callback = callback || function() { };
12-
if (typeof events[event] === 'undefined') {
13-
events[event] = [callback];
8+
const Noop = () => {};
9+
10+
class EventEmitter {
11+
constructor() {
12+
this.events = [];
13+
}
14+
15+
on(event, handler = Noop) {
16+
if (typeof this.events[event] === 'undefined') {
17+
this.events[event] = [handler];
1418
} else {
15-
events[event].push(callback);
19+
this.events[event].push(handler);
1620
}
17-
};
21+
}
1822

19-
this.emit = function(event, args) {
20-
if (typeof events[event] !== 'undefined') {
21-
events[event].forEach(function(fn) {
22-
fn(args);
23-
});
23+
once(event, handler = Noop) {
24+
const once = `once_${event}`;
25+
if (typeof this.events[once] === 'undefined') {
26+
this.events[once] = [handler];
2427
} else {
25-
throw new Error('event: ' + event + ', not found');
28+
this.events[once].push(handler);
2629
}
27-
};
30+
}
31+
32+
emit(event, args) {
33+
const once = `once_${event}`;
34+
if (typeof this.events[once] !== 'undefined') {
35+
this.events[once].forEach((handler) => {
36+
handler(args);
37+
});
38+
delete this.events[`once_${event}`];
39+
}
40+
if (typeof this.events[event] !== 'undefined') {
41+
this.events[event].forEach((handler) => {
42+
handler(args);
43+
});
44+
}
45+
}
2846

29-
this.off = function(event) {
30-
if (typeof events[event] !== 'undefined') {
31-
delete events[event];
47+
off(event, handler) {
48+
if (typeof this.events[event] !== 'undefined') {
49+
if (!!handler) {
50+
const index = this.events[event].indexOf(handler);
51+
this.events[event].splice(index, 1);
52+
} else {
53+
delete this.events[event];
54+
}
3255
}
3356
};
3457
}
3558

3659
function test() {
37-
var eh = new EventHandle();
60+
const eh = new EventEmitter();
61+
62+
const firstHd = (str) => {console.log('first greet: ', str);};
3863

39-
eh.on('greet', function(str) {
40-
console.log(str);
41-
});
64+
eh.on('greet', firstHd);
4265

43-
eh.on('greet', function(name) {
44-
console.log(name + ', hello!');
45-
});
66+
eh.on('greet', (str) => {console.log('second greet: ', str);});
4667

47-
eh.on('bye', function(name) {
48-
console.log(name + ', goodbye!');
49-
});
68+
eh.on('bye', (name) => {console.log(name + ', goodbye!');});
69+
70+
eh.once('break', (str) => {console.log(`once break: ${str}`);});
71+
eh.on('break', (str) => {console.log(`on break: ${str}`);});
5072

5173
console.log('====== start ======');
5274
eh.emit('greet', 'Green');
5375
eh.emit('bye', 'Mark');
76+
eh.emit('break', 'Jack');
77+
eh.emit('break', 'Tony');
5478

5579
console.log('====== removeListener ======');
5680
eh.off('bye');
5781
eh.emit('bye', 'Mark');
82+
83+
eh.off('greet', firstHd);
84+
eh.emit('greet', 'Green');
5885
}
5986

6087
test();

0 commit comments

Comments
 (0)