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']