Skip to content

Instantly share code, notes, and snippets.

@determin1st
Last active March 25, 2020 10:40
Show Gist options
  • Save determin1st/ef6218cc544e2bb6a69c9b82ecdec84e to your computer and use it in GitHub Desktop.
Save determin1st/ef6218cc544e2bb6a69c9b82ecdec84e to your computer and use it in GitHub Desktop.
setTimeout wrapper (w3ui)
timeout: do ->
# helpers
tick = (promise, ms, callback) -> !-> # {{{
# invoke and check the result
if callback and callback!
# continue
# re-create a timer
promise.timer = setTimeout (tick promise, ms, callback), ms
else
# finish
promise.cancel!
# }}}
cancel = (promise) -> !-> # {{{
# stop timer
if promise.timer
clearTimeout promise.timer
# resolve
promise.timer = 0
promise.pending = false
promise.resolve!
# }}}
# main
return (ms, callback) ->
# create a Promise and
# extract its resolver
r = null
p = new Promise (resolve) !->
r := resolve
# extend standard object
p.timer = setTimeout (tick p, ms, callback), ms
p.pending = true
p.cancel = cancel p
p.resolve = r
# done
return p
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment