shortcake
Version:
Asynchronous invoke and other goodies for cake.
46 lines (34 loc) • 827 B
text/coffeescript
import log from '../log'
import running from '../running'
import {isPromise} from '../utils'
# Invoke a enerator task continually until consumed
invokeGenerator = (name, action, opts, cb) ->
log.debug 'invokeGenerator', name
running.start name
gen = action opts
last = null
prev = null
done = (err) ->
running.stop name
console.error err.stack if err?
cb err, (last ? prev)
next = (value) ->
try
res = gen.next value
catch err
console.error err.stack
return done err
prev = last
last = res.value
if isPromise promise = res.value
promise
.then (value) ->
next value
.catch (err) ->
done err
else if not res.done
next res.value
else
done()
next()
export default invokeGenerator