One idea is to setup a queue to chain asynchronous calculations using promises like this:
function compute(queue, previousResult) {
if (!queue.length) return previousResult;
return new Promise((resolve, reject) => {
//Get Operation
var operation = queue.shift();
//If there is nothing to calculate just resolve the promise
if (!operation[0]) {
resolve(0);
}
//Execute the computation function and give it the
//resolve callback to resolve the promise when the calculations done
operation[1](operation[0], previousResult || null, resolve);
}).then(result => {
//Call the next calculation with result of the previous one
return compute(queue, result);
});
}
Then:
var A = 10;
function computeA(a, previous, resolve) {
$.get('https://httpbin.org/get').then(function() {
resolve(a*10);
});
}
var B = 20;
function computeB(b, previous, resolve) {
resolve(previous + b * 10);
}
var C = 20;
function computeC(c, previous, resolve) {
resolve(previous + c * 10);
}
compute([
[A, computeA],
[B, computeB],
[C, computeC]
]).then(function(result) {
console.log(result);
});
Demo:
function compute(queue, previousResult) {
if (!queue.length) return previousResult;
return new Promise((resolve, reject) => {
//Get Operation
var operation = queue.shift();
//If there is nothing to calculate just resolve the promise
if (!operation[0]) {
resolve(0);
}
//Execute the computation function
operation[1](operation[0], previousResult || null, resolve);
}).then(result => {
//Call the next calculation with result of the previous one
return compute(queue, result);
});
}
var A = 10;
function computeA(a, previous, resolve) {
$.get('https://httpbin.org/get').then(function() {
resolve(a*10);
});
}
var B = 20;
function computeB(b, previous, resolve) {
resolve(previous + b * 10);
}
var C = 20;
function computeC(c, previous, resolve) {
resolve(previous + c * 10);
}
compute([
[A, computeA],
[B, computeB],
[C, computeC]
]).then(function(result) {
console.log(result);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>