Promise.coffee 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # From: http://dev.bizo.com/2011/12/promises-in-javascriptcoffeescript.html
  2. class Promise
  3. @when: (tasks...) ->
  4. num_uncompleted = tasks.length
  5. args = new Array(num_uncompleted)
  6. promise = new Promise()
  7. for task, task_id in tasks
  8. ((task_id) ->
  9. task.then(() ->
  10. args[task_id] = Array.prototype.slice.call(arguments)
  11. num_uncompleted--
  12. promise.complete.apply(promise, args) if num_uncompleted == 0
  13. )
  14. )(task_id)
  15. return promise
  16. constructor: ->
  17. @resolved = false
  18. @end_promise = null
  19. @result = null
  20. @callbacks = []
  21. resolve: ->
  22. if @resolved
  23. return false
  24. @resolved = true
  25. @data = arguments
  26. if not arguments.length
  27. @data = [true]
  28. @result = @data[0]
  29. for callback in @callbacks
  30. back = callback.apply callback, @data
  31. if @end_promise
  32. @end_promise.resolve(back)
  33. fail: ->
  34. @resolve(false)
  35. then: (callback) ->
  36. if @resolved == true
  37. callback.apply callback, @data
  38. return
  39. @callbacks.push callback
  40. @end_promise = new Promise()
  41. window.Promise = Promise
  42. ###
  43. s = Date.now()
  44. log = (text) ->
  45. console.log Date.now()-s, Array.prototype.slice.call(arguments).join(", ")
  46. log "Started"
  47. cmd = (query) ->
  48. p = new Promise()
  49. setTimeout ( ->
  50. p.resolve query+" Result"
  51. ), 100
  52. return p
  53. back = cmd("SELECT * FROM message").then (res) ->
  54. log res
  55. return "Return from query"
  56. .then (res) ->
  57. log "Back then", res
  58. log "Query started", back
  59. ###