@asilvas/promise-flatten

    0.1.0 • Public • Published

    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

    https://twitter.com/Aaron_Silvas/status/1120721934730137601

    Install

    npm i @asilvas/promise-flatten

    DownloadsWeekly Downloads

    0

    Version

    0.1.0

    License

    MIT

    Unpacked Size

    2.92 kB

    Total Files

    3

    Last publish

    Collaborators

    • asilvas