0.1.0 • Published 4 years ago
@asilvas/promise-flatten v0.1.0
Promise.prototype.flatten
function
- Spec in progress
Champions
- Work in progress
Status
This proposal is stage 0 in the TC39 Process.
Inspired By
https://twitter.com/DavidWells/status/1119729914876284928
Examples
While try -> catch
works well, it introduces a lot of noise into software that can be avoided.
Consider:
async function test(promise1, promise2, promise3) {
let val1, val2, val3;
try {
val1 = await promise1;
} catch (ex) {
// ignore exceptions
}
try {
[val2, val3] = await Promise.all([promise2, promise3]);
} catch (ex) {
throw ex; // throw to caller
}
return val1 + val2 + val3;
}
Above contains a fair amount of boilerplate for a relatively simple logic flow. Now let's look at
an alternative using flatten
:
async function test(promise1, promise2, promise3) {
const [, val1] = await promise1.flatten(); // ignore exceptions
const [err, [val2, val3] = []] = await Promise.all([promise2, promise3]).flatten();
if (err) throw err; // throw to caller
return val1 + val2 + val3;
}
Under the covers both examples accomplish the same, but flatten
can reduce code footprint and increase readability.
Polyfill
function flatten() {
return this.then(ret => [undefined, ret]).catch(err => [err, undefined]);
}
Doesn't get much simpler than this. Tests included.
Discussion
0.1.0
4 years ago