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...