Parallel JS Promises Demo

Parallel JS Promises Demo

by pertrai1

HTML

<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/q.js/1.0.1/q.js"></script>
<body>
    <div class="container">
        	<h4>Parallel Promises</h4>

        <div class="jumbotron" id='log'></div>
    </div>
</body>

CSS

body {
    background-color: LemonChiffon;
}
.jumbotron {
    border: thin solid;
}

JavaScript

'use strict';
var demoFn = function () {
    var lineNum = 0;
    
    var log = function (str, color) {
        var hstr;
        var prefix = str.length ? String(++lineNum) + '. ' : '';
        str = prefix + str;
        if (typeof document !== 'undefined') {
            hstr = str;
            if (typeof color === 'string') {
                hstr = '<span style="color: ' + color + '; font-weight: 900;">' + str + '<span>';
            }
            document.getElementById('log').innerHTML += (hstr + '<br />');
        };
        console.log(str);
    };

    var badStuff = 'all that jazz';
    
    var makeAPromise = function (arg) {
        var deferred = Q.defer();
        var delay = 3000;

        // Simulate an async request that resovles the 
        // promise, or rejects it.
        try {
            setTimeout(function () {
                if (arg === badStuff) {
                    deferred.reject("I don't like '" + arg + "'!");
                } else {
                    deferred.resolve(arg);
                }
            }, delay);
        } catch (error) {
            deferred.reject(error);
        }
        return deferred.promise;
    };

    var promiseVals = ['To ', 'be, ', 'or ',
        'not ', 'to ', 'be, ', 'that ',
        'is ', 'the ', 'question.'];

    var startParallelActions = function () {
        var promises = [];

        // Make an asynchronous action from each arg
        promiseVals.forEach(function (value) {
            promises.push(makeAPromise(value));
        });
        if (Math.random() * 10 > 6) {
            promises.push(makeAPromise(badStuff));
        }
        // Consolidate all promises into a promise of promises
        return Q.all(promises);
    };

    // Returns a king promise that wraps an array of promises.
    // Handle the resolution of the king promise within main().
    var main = function () {
        var kingPromise = startParallelActions();
        log(String(promiseVals.length) + ' promises...