Skip to content

Commit 57f7ef9

Browse files
committed
Implement Expirable as a Promise wrapper
1 parent 4ea34ae commit 57f7ef9

1 file changed

Lines changed: 43 additions & 14 deletions

File tree

JavaScript/b-expirable.js

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,68 @@
22

33
const PROMISE_TIMEOUT = 1000;
44

5-
class Expirable extends Promise {
5+
class Expirable {
66
constructor(executor) {
7-
super((resolve, reject) => {
7+
const promise = new Promise((resolve, reject) => {
88
executor(val => {
9-
if (this.expired) {
10-
reject(new Error('Expired'));
11-
return;
12-
}
9+
if (this.expired) return;
1310
clearTimeout(this.timer);
1411
resolve(val);
15-
}, reject);
12+
}, err => {
13+
if (this.expired) return;
14+
clearTimeout(this.timer);
15+
reject(err);
16+
});
17+
this.timer = setTimeout(() => {
18+
this.expired = true;
19+
reject(new Error('Expired'));
20+
}, PROMISE_TIMEOUT);
1621
});
22+
this.promise = promise;
1723
this.expired = false;
18-
this.timer = setTimeout(() => {
19-
this.expired = true;
20-
}, PROMISE_TIMEOUT);
24+
this.timer = null;
25+
return this.promise;
2126
}
2227
}
2328

2429
// Usage
2530

2631
new Expirable(resolve => {
27-
setTimeout(resolve, 100);
32+
setTimeout(() => {
33+
resolve('Resolved before timeout');
34+
}, 100);
35+
}).then(data => {
36+
console.dir({ data });
37+
}).catch(error => {
38+
console.dir({ error: error.message });
39+
});
40+
41+
new Expirable((resolve, reject) => {
42+
setTimeout(() => {
43+
reject(new Error('Something went wrong'));
44+
}, 100);
2845
}).then(data => {
2946
console.dir({ data });
3047
}).catch(error => {
31-
console.dir({ error });
48+
console.dir({ error: error.message });
3249
});
3350

3451
new Expirable(resolve => {
35-
setTimeout(resolve, 2000);
52+
setTimeout(() => {
53+
resolve('Never resolved before timeout');
54+
}, 2000);
55+
}).then(data => {
56+
console.dir({ data });
57+
}).catch(error => {
58+
console.dir({ error: error.message });
59+
});
60+
61+
new Expirable((resolve, reject) => {
62+
setTimeout(() => {
63+
reject(new Error('Never rejected before timeout'));
64+
}, 2000);
3665
}).then(data => {
3766
console.dir({ data });
3867
}).catch(error => {
39-
console.dir({ error });
68+
console.dir({ error: error.message });
4069
});

0 commit comments

Comments
 (0)