Playing around with $q
by bjoerne
HTML
<script src="http://code.angularjs.org/1.2.6/angular.min.js"></script>
<script src="http://code.angularjs.org/1.2.6/angular-sanitize.min.js"></script>
<div ng-controller="ExampleController">
<p>{{name}}</p>
<p ng-bind-html="log"></p>
<p><button ng-click="click()">Who are you?</button></p>
</div>
CoffeeScript
class ExecutionQueue
@ExampleController = ($scope, $q) ->
_init = ->
_log 'Started...'
promises = []
for i in [0..99]
promise = _queuedApply _waitAndOutput, @, [i]
promise.then (name) ->
_log name
promises.push promise
$q.all(promises).then ->
_log 'Finished'
_log 'Initialized...'
$scope.click = ->
promise = _askForName()
promise.then (answer) ->
$scope.name = answer
_askForName()
.then (answer) ->
$scope.name += " " + answer
$q.all([_askForName(), _askForName()]).then (answers) ->
console.log answers
$scope.name = 'waiting for an answer...'
_queuedApply = (method, context, args) ->
window.POOL = window.POOL || []
deferred = $q.defer()
deferred.resolve(method.apply context, args)
deferred.promise
_askForName = ->
deferred = $q.defer()
setTimeout ->
deferred.resolve('Batman')
, 1000
deferred.promise
_waitAndOutput = (output) ->
deferred = $q.defer()
setTimeout ->
deferred.resolve(output)
, 1000
deferred.promise
_log = (msg) ->
$scope.log = ($scope.log || "") + msg + "<br />"
_init()
myApp = angular.module 'myApp', ['ngSanitize']
angular.bootstrap document, ['myApp']