Skip to content

Instantly share code, notes, and snippets.

@shanewholloway
Last active August 6, 2017 03:16
Show Gist options
  • Save shanewholloway/637374eed8e55af1b76ae3e8f37cc45a to your computer and use it in GitHub Desktop.
Save shanewholloway/637374eed8e55af1b76ae3e8f37cc45a to your computer and use it in GitHub Desktop.
Promise.some :: A cross between Array.some, Promise.all, and Promise.race
function promiseSome(promises) ::
// a cross between Promise.all and Promise.race
promises = Array.from(promises).filter(e => e)
return new Promise @ resolve => ::
const result = []
result.done = new Promise @ done => ::
let count = promises.length
if 0 === count ::
resolve(result)
done(result)
return
for const p of promises ::
p.then @ do_append, do_error
function do_append(ans) ::
--count
result.push(ans)
resolve(result)
if 0 < count :: return
done(result)
function do_error() ::
--count
if 0 < count :: return
done(result)
resolve(result)
async function answer(v) ::
await sleep @ 10 + 100 * Math.random()
return v
async function fail(e) ::
await sleep @ 10 + 100 * Math.random()
throw new Error @ e
function sleep(ms) ::
return new Promise @ resolve =>
setTimeout @ resolve, ms
main()
async function main() ::
const outer = promiseSome @ @[]
answer @ 1942
, fail @ 'no'
, fail @ 'noOOOOooOO'
, answer @ 2142
, answer @ 2042
, fail @ 'likely not'
, answer @ 42
console.log @ outer
const inner = await outer
console.log @ inner, outer
const done = await inner.done
console.log @ done, inner, outer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment