{"_id":"@asilvas/promise-flatten","_rev":"1-80fe02ee348944861fdd4f9fcf1ddaff","name":"@asilvas/promise-flatten","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@asilvas/promise-flatten","version":"0.1.0","description":"TC39 Proposal for `Promise.prototype.flatten` function","main":"polyfill.js","scripts":{"build":"nyc mkdir -p out && ecmarkup spec/index.html --js=out/spec.js --css=out/spec.css out/index.html","cover":"nyc ava --verbose","prepublish":"npm run cover","test":"ava --verbose","watch":"nyc mkdir -p out && ecmarkup spec/index.html --js=out/spec.js --css=out/spec.css out/index.html --watch"},"repository":{"type":"git","url":"git+https://github.com/asilvas/proposal-promise-flatten.git"},"keywords":["ecmascript","tc39"],"author":{"name":"Aaron Silvas"},"license":"MIT","bugs":{"url":"https://github.com/asilvas/proposal-promise-flatten/issues"},"homepage":"https://github.com/asilvas/proposal-promise-flatten#readme","devDependencies":{"ava":"^1.4.1","ecmarkup":"^3.16.0","nyc":"^14.0.0"},"gitHead":"b33a943e5a9cfb49cbe566abc1a0214f049dcfe6","_id":"@asilvas/promise-flatten@0.1.0","_nodeVersion":"12.12.0","_npmVersion":"6.11.3","dist":{"integrity":"sha512-JgEBCGQw13ljIg1L3ojLSNw8B06m3G+IZQEIs96Zjv6ikkHqgMixaNEb9eW/fqUpCev4Zayj4YG0xJEPIkRBTA==","shasum":"5d4c943a34afcec1532fe7b8b23577ed3a8767f0","tarball":"https://registry.npmjs.org/@asilvas/promise-flatten/-/promise-flatten-0.1.0.tgz","fileCount":3,"unpackedSize":2918,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeFl5mCRA9TVsSAnZWagAATsYP/1+g3Jum98UD3okrL62E\nrMWYrFB2UJmTsowVUUKoFW9b+S6DzM+MeTEXD3ZeqbkFpSsLDntq+53HrjTF\n0GvBwxgT3F69yhiVValxns8Yl4FrZ8Z1K07j0CS5N59OEJ3HgDJfTPMFWem4\nCEWZrw9T4aeIUffKY3gEKGCzfBlkcHHEa5kvu9RyV2LFVv9EtQm8GMy+Gl/0\nQ6kOMSJCsfLGz10isYRNfQ1ibLyA9E2BTG3B+7z23Toxa0KH9kI+fTvreXu7\n3qxZdkwKIfqNZ+dSWOgnRWmi3eIAZEKuHjxkhhObouNvyjVo+Rv7lr9pDdRi\nOHjXxH9hdBdP2LSFw/ZXLXzNcdoxN5H87vJ+XUSqqmzYm6Xl2pDRbSboMNN/\nN+5lCYiE0GcQeGQKRZYDEPGsqOhDN41SoDBjt7F6j9wbm/jWBnrn4KJpCIYx\nV2Guk4PkwyGcErUFf1DZU19dpzVs3aP7ylnLVCjidUWeB2H8BuoP5dU53kH/\n7ZXoJvK7B4zA3Rime2gVcBU7a500uik0BLwhW6V6V5fpfUbe3ltBEV9KE2DO\nUwdQPIGKmL2IefMcRMFevDSW9O8qSTHRkdSUYhSsldch4qhVYu2hNGql+jYM\nfZvM5W1QN8YUysopS6kjIpUD8KnWTkZIi9yKiHhRS/0KbNRAVx7vhC/DQdVK\nO5Rv\r\n=4qKw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEUlOHgJ3WphunxkS05v/1r4pEz9kNZhlI146XFuN/0GAiEAgcIxFxkt/4J8KwWdbcfvwAc14oF/0gw7PAqXGv6Tg60="}]},"maintainers":[{"name":"asilvas","email":"asilvas@godaddy.com"}],"_npmUser":{"name":"asilvas","email":"asilvas@godaddy.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/promise-flatten_0.1.0_1578524262132_0.569566102483636"},"_hasShrinkwrap":false}},"time":{"created":"2020-01-08T22:57:42.099Z","0.1.0":"2020-01-08T22:57:42.245Z","modified":"2022-04-04T15:46:18.102Z"},"maintainers":[{"name":"asilvas","email":"asilvas@godaddy.com"}],"description":"TC39 Proposal for `Promise.prototype.flatten` function","homepage":"https://github.com/asilvas/proposal-promise-flatten#readme","keywords":["ecmascript","tc39"],"repository":{"type":"git","url":"git+https://github.com/asilvas/proposal-promise-flatten.git"},"author":{"name":"Aaron Silvas"},"bugs":{"url":"https://github.com/asilvas/proposal-promise-flatten/issues"},"license":"MIT","readme":"# `Promise.prototype.flatten` function\r\n\r\n- Spec in progress\r\n\r\n\r\n## Champions\r\n\r\n- Work in progress\r\n\r\n\r\n## Status\r\n\r\nThis proposal is stage 0 in the [TC39 Process](https://tc39.github.io/process-document/).\r\n\r\n\r\n## Inspired By\r\n\r\nhttps://twitter.com/DavidWells/status/1119729914876284928\r\n\r\n\r\n## Examples\r\n\r\nWhile `try -> catch` works well, it introduces a lot of noise into software that can be avoided.\r\n\r\nConsider:\r\n\r\n```\r\nasync function test(promise1, promise2, promise3) {\r\n  let val1, val2, val3;\r\n\r\n  try {\r\n    val1 = await promise1;\r\n  } catch (ex) {\r\n    // ignore exceptions\r\n  }\r\n\r\n  try {\r\n    [val2, val3] = await Promise.all([promise2, promise3]);\r\n  } catch (ex) {\r\n    throw ex; // throw to caller\r\n  }\r\n\r\n  return val1 + val2 + val3;\r\n}\r\n```\r\n\r\nAbove contains a fair amount of boilerplate for a relatively simple logic flow. Now let's look at\r\nan alternative using `flatten`:\r\n\r\n```\r\nasync function test(promise1, promise2, promise3) {\r\n  const [, val1] = await promise1.flatten(); // ignore exceptions\r\n  const [err, [val2, val3] = []] = await Promise.all([promise2, promise3]).flatten();\r\n\r\n  if (err) throw err; // throw to caller\r\n\r\n  return val1 + val2 + val3;\r\n}\r\n```\r\n\r\nUnder the covers both examples accomplish the same, but `flatten` can reduce code footprint and increase readability.\r\n\r\n\r\n## Polyfill\r\n\r\n```\r\nfunction flatten() {\r\n  return this.then(ret => [undefined, ret]).catch(err => [err, undefined]);\r\n}\r\n```\r\n\r\nDoesn't get much simpler than this. Tests included.\r\n\r\n\r\n## Discussion\r\n\r\nhttps://twitter.com/Aaron_Silvas/status/1120721934730137601\r\n","readmeFilename":"README.md"}