Skip to content

Commit 94e14be

Browse files
committed
Better Deferred example
1 parent 84cd2e7 commit 94e14be

File tree

1 file changed

+49
-16
lines changed

1 file changed

+49
-16
lines changed

JavaScript/a-deferred.js

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,57 @@
11
'use strict';
22

3-
const getConferences = () => {
4-
let onDone = null;
5-
const deferred = {
6-
onData: callback => onDone = callback
7-
};
8-
setTimeout(() => {
9-
if (onDone) onDone(['Tehran', 'Yalta', 'Potsdam']);
10-
}, 5000);
11-
return deferred;
12-
};
3+
class Deferred {
4+
constructor() {
5+
this.value = undefined;
6+
this.error = null;
7+
this.finished = false;
8+
this.events = {};
9+
}
10+
11+
resolve(value) {
12+
if (this.finished) return;
13+
this.value = value;
14+
this.finished = true;
15+
const event = this.events['done'];
16+
if (event) event.forEach(fn => fn(value));
17+
}
18+
19+
reject(err) {
20+
if (this.finished) return;
21+
this.error = err;
22+
this.finished = true;
23+
const event = this.events['fail'];
24+
if (event) event.forEach(fn => fn(err));
25+
}
26+
27+
done(fn) {
28+
if (this.finished) return;
29+
const event = this.events['done'];
30+
if (event) event.push(fn);
31+
else this.events['done'] = [fn];
32+
return this;
33+
}
34+
35+
fail(fn) {
36+
if (this.finished) return;
37+
const event = this.events['fail'];
38+
if (event) event.push(fn);
39+
else this.events['fail'] = [fn];
40+
return this;
41+
}
42+
}
1343

1444
// Usage
1545

16-
const conferences = getConferences();
46+
const conferences = new Deferred()
47+
.done(list => {
48+
console.log(list);
49+
})
50+
.fail(err => {
51+
throw err;
52+
});
1753

1854
console.log(conferences);
1955

20-
conferences.onData(list => {
21-
console.log(list);
22-
});
23-
24-
console.log('end');
56+
conferences.resolve(['Tehran', 'Yalta', 'Potsdam']);
57+
conferences.reject(new Error('Never occurs'));

0 commit comments

Comments
 (0)