Skip to content

Commit d873530

Browse files
committed
Implement improved examples
1 parent 3f68e9f commit d873530

File tree

3 files changed

+253
-0
lines changed

3 files changed

+253
-0
lines changed

JavaScript/4-class.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
'use strict';
2+
3+
const DEFERRED_PENDING = 0;
4+
const DEFERRED_RESOLVED = 1;
5+
const DEFERRED_REJECTED = 2;
6+
7+
class Deferred {
8+
constructor(onDone = null, onFail = null) {
9+
this.value = undefined;
10+
this.onDone = onDone;
11+
this.onFail = onFail;
12+
this.status = DEFERRED_PENDING;
13+
}
14+
15+
isPending() {
16+
return this.status === DEFERRED_PENDING;
17+
}
18+
19+
isResolved() {
20+
return this.status === DEFERRED_RESOLVED;
21+
}
22+
23+
isRejected() {
24+
return this.status === DEFERRED_REJECTED;
25+
}
26+
27+
done(callback) {
28+
this.onDone = callback;
29+
if (this.isResolved()) callback(this.value);
30+
return this;
31+
}
32+
33+
fail(callback) {
34+
this.onFail = callback;
35+
if (this.isRejected()) callback(this.value);
36+
return this;
37+
}
38+
39+
resolve(value) {
40+
this.value = value;
41+
if (this.onDone) this.onDone(value);
42+
return this;
43+
}
44+
45+
reject(value) {
46+
this.value = value;
47+
if (this.onFail) this.onFail(value);
48+
return this;
49+
}
50+
}
51+
52+
// Usage
53+
54+
const persons = {
55+
10: 'Marcus Aurelius',
56+
11: 'Mao Zedong',
57+
12: 'Rene Descartes',
58+
};
59+
60+
const getPerson = id => {
61+
const result = new Deferred();
62+
setTimeout(() => {
63+
const name = persons[id];
64+
if (name) result.resolve({ id, name });
65+
else result.reject(new Error('Person is not found'));
66+
}, 1000);
67+
return result;
68+
};
69+
70+
const d1 = getPerson(10)
71+
.done(value => console.log('Resolved d1', value))
72+
.fail(error => console.log('Resolved d1', error));
73+
console.dir({ d1 });
74+
75+
const d2 = getPerson(20)
76+
.done(value => console.log('Resolved d2', value))
77+
.fail(error => console.log('Resolved d2', error.message));
78+
console.dir({ d2 });

JavaScript/5-emitter.js

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
'use strict';
2+
3+
const { EventEmitter } = require('events');
4+
5+
const DEFERRED_PENDING = 0;
6+
const DEFERRED_RESOLVED = 1;
7+
const DEFERRED_REJECTED = 2;
8+
9+
class Deferred extends EventEmitter {
10+
constructor(onDone = null, onFail = null) {
11+
super();
12+
this.value = undefined;
13+
if (onDone) this.on('done', onDone);
14+
if (onFail) this.on('fail', onFail);
15+
this.status = DEFERRED_PENDING;
16+
}
17+
18+
isPending() {
19+
return this.status === DEFERRED_PENDING;
20+
}
21+
22+
isResolved() {
23+
return this.status === DEFERRED_RESOLVED;
24+
}
25+
26+
isRejected() {
27+
return this.status === DEFERRED_REJECTED;
28+
}
29+
30+
done(callback) {
31+
this.on('done', callback);
32+
if (this.isResolved()) callback(this.value);
33+
return this;
34+
}
35+
36+
fail(callback) {
37+
this.on('fail', callback);
38+
if (this.isRejected()) callback(this.value);
39+
return this;
40+
}
41+
42+
resolve(value) {
43+
this.value = value;
44+
this.emit('done', value);
45+
return this;
46+
}
47+
48+
reject(value) {
49+
this.value = value;
50+
this.emit('fail', value);
51+
return this;
52+
}
53+
}
54+
55+
// Usage
56+
57+
const persons = {
58+
10: 'Marcus Aurelius',
59+
11: 'Mao Zedong',
60+
12: 'Rene Descartes',
61+
};
62+
63+
const getPerson = id => {
64+
const result = new Deferred();
65+
setTimeout(() => {
66+
const name = persons[id];
67+
if (name) result.resolve({ id, name });
68+
else result.reject(new Error('Person is not found'));
69+
}, 1000);
70+
return result;
71+
};
72+
73+
const d1 = getPerson(10)
74+
.done(value => console.log('Resolved d1', value))
75+
.fail(error => console.log('Resolved d1', error));
76+
console.dir({ d1 });
77+
78+
const d2 = getPerson(20)
79+
.done(value => console.log('Resolved d2', value))
80+
.fail(error => console.log('Resolved d2', error.message));
81+
console.dir({ d2 });

JavaScript/6-promise.js

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
'use strict';
2+
3+
const { EventEmitter } = require('events');
4+
5+
const DEFERRED_PENDING = 0;
6+
const DEFERRED_RESOLVED = 1;
7+
const DEFERRED_REJECTED = 2;
8+
9+
class Deferred extends EventEmitter {
10+
constructor(onDone = null, onFail = null) {
11+
super();
12+
this.value = undefined;
13+
if (onDone) this.on('done', onDone);
14+
if (onFail) this.on('fail', onFail);
15+
this.status = DEFERRED_PENDING;
16+
}
17+
18+
isPending() {
19+
return this.status === DEFERRED_PENDING;
20+
}
21+
22+
isResolved() {
23+
return this.status === DEFERRED_RESOLVED;
24+
}
25+
26+
isRejected() {
27+
return this.status === DEFERRED_REJECTED;
28+
}
29+
30+
done(callback) {
31+
this.on('done', callback);
32+
if (this.isResolved()) callback(this.value);
33+
return this;
34+
}
35+
36+
fail(callback) {
37+
this.on('fail', callback);
38+
if (this.isRejected()) callback(this.value);
39+
return this;
40+
}
41+
42+
resolve(value) {
43+
this.value = value;
44+
this.emit('done', value);
45+
return this;
46+
}
47+
48+
reject(value) {
49+
this.value = value;
50+
this.emit('fail', value);
51+
return this;
52+
}
53+
54+
promise() {
55+
return new Promise((resolve, reject) => {
56+
this.on('done', value => resolve(value));
57+
this.on('fail', error => reject(error));
58+
});
59+
}
60+
}
61+
62+
// Usage
63+
64+
const persons = {
65+
10: 'Marcus Aurelius',
66+
11: 'Mao Zedong',
67+
12: 'Rene Descartes',
68+
};
69+
70+
const getPerson = id => {
71+
const result = new Deferred();
72+
setTimeout(() => {
73+
const name = persons[id];
74+
if (name) result.resolve({ id, name });
75+
else result.reject(new Error('Person is not found'));
76+
}, 1000);
77+
return result;
78+
};
79+
80+
(async () => {
81+
try {
82+
const value = await getPerson(10).promise();
83+
console.log('Resolved p1', value);
84+
} catch (e) {
85+
console.log('Rejected p1', e.message);
86+
}
87+
88+
try {
89+
const value = await getPerson(20).promise();
90+
console.log('Resolved p2', value);
91+
} catch (e) {
92+
console.log('Rejected p2', e.message);
93+
}
94+
})();

0 commit comments

Comments
 (0)