Skip to content

Instantly share code, notes, and snippets.

@EnoahNetzach
Created November 4, 2016 09:59

Revisions

  1. EnoahNetzach created this gist Nov 4, 2016.
    42 changes: 42 additions & 0 deletions raceAgainst.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,42 @@
    const raceAgainst = (fn, timeout) => new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
    resetTimer()
    resolve(false)
    }, timeout)

    const resetTimer = () => timer && clearTimeout(timer)

    const asyncFn = async () => {
    try {
    await fn()
    resolve(true)
    } catch (error) {
    reject(error)
    } finally {
    resetTimer()
    }
    }

    asyncFn()
    })

    const asyncSideEffect = ok => async () => {
    await new Promise((resolve, reject) => setTimeout(ok ? resolve : reject, 200))
    return 42
    }

    await raceAgainst(asyncSideEffect(true), 100)
    .then(x => console.log(x ? 'in time' : 'too late'))
    .catch(() => console.error('error'))

    await raceAgainst(asyncSideEffect(true), 300)
    .then(x => console.log(x ? 'in time' : 'too late'))
    .catch(() => console.error('error'))

    await raceAgainst(asyncSideEffect(false), 100)
    .then(x => console.log(x ? 'in time' : 'too late'))
    .catch(() => console.error('error'))

    await raceAgainst(asyncSideEffect(false), 300)
    .then(x => console.log(x ? 'in time' : 'too late'))
    .catch(() => console.error('error'))