spectacular
Version:
Advanced BDD framework for CoffeeScript and JavaScript
126 lines (98 loc) • 2.52 kB
text/coffeescript
#### Promise
class spectacular.Promise
: (value=0) ->
promise = new spectacular.Promise
promise.resolve value
promise
: (promises) ->
promise = new spectacular.Promise
solved = 0
results = []
promises.forEach (p) ->
p
.then (value) ->
solved++
results[promises.indexOf p] = value
promise.resolve results if solved is promises.length
.fail (reason) ->
promise.reject reason
promise
constructor: ->
= true
= null
= undefined
= []
= []
= []
isPending: ->
isResolved: -> not
isFulfilled: -> not and
isRejected: -> not and not
then: (fulfilledHandler, errorHandler, progressHandler) ->
promise = new spectacular.Promise
f = (value)->
try
res = fulfilledHandler? value
catch err
promise.reject err
return
if res?.then?
res
.then (value) ->
promise.resolve value
.fail (reason) ->
promise.reject reason
else
promise.resolve res
e = (reason) ->
errorHandler? reason
promise.reject reason
if
.push f
.push e
.push progressHandler if progressHandler?
else
if
f
else
e
promise
fail: (errorHandler) -> (->), errorHandler
resolve: (value) ->
return unless
= value
= true
= false
reject: (reason) ->
return unless
= reason
= false
= false
notifyHandlers: ->
return unless
if
handler for handler in
else
handler for handler in
this
class spectacular.AsyncPromise extends spectacular.Promise
constructor: ->
= null
= 5000
= 'Timed out'
super()
run: =>
lastTime = new Date()
= setInterval =>
if new Date() - lastTime >=
new Error
, 10
reject: (reason) ->
clearInterval
super reason
resolve: (value) ->
clearInterval
super value
rejectAfter: (, ) ->