Language: JavaScript
Recursion - Not my Favorite Topic.
Promises - They can get confusing.
Recursion + Promises - I need to program in a padded room.
I made this little JS Fiddle puzzle I call The RecursiveFunHouse as comedic way of keeping my sanity by simplifying the issue into something silly. Hopefully yall can get a laugh out of my pain :)
The Problem:
Each recursive call is dependent on the outcome of the previous call, but in order to get the outcome I must run an asynchronous task and use that outcome in other sub tasks.
The Recursive Fun House helped me boil down the issue to this - the original recursive loop is continuing on with an undefined value as the sub tasks are still executing.
The Fun House - loops around collecting random numbers between (-99) and 99. Once the last difference between the last number and the new number is positive the fun is over
Printing Made it here 1...Made it here 6 should indicate that the sub-tasks were handled correctly and we have a value for the next loop.
Current it prints 1,2,3,6,4,5 :(
recursiveFunHouse.js
var recursiveFunHouse = function(num){
console.log(Made it here 1);
var newNum = performSideTasks();
console.log(Made it here 6);
console.log(newNum);
console.log(newNum);
if(newNum-num >0 ){
recursiveFunHouse(newNum);
}
else{
console.log(The FunHouse Generated These Numbers :)
for(var i = 0; i <numList.length; i++){
console.log(numList[i]);
}
}
};
var performSideTasks = function(){
console.log(Made it here 2);
someAsyncTask().then(function(num){
anotherTask(num);
console.log(made it here 5);
return num;
});
}
var someAsyncTask = function(){
return new Promise (function(resolve, reject) {
console.log(made it here 3);
var randNum = Math.floor(Math.random()*99) + 1;
randNum *= Math.floor(Math.random()*2) == 1 ? 1 : -1;
setTimeout(function() {
numList.push(randNum)
resolve(randNum)
}, 100);
});
}
var anotherTask = function(num){
console.log(made it here 4);
console.log(num);
};
var numList= [];
recursiveFunHouse(20);
Note - Forgive my pathetic return statement return num;
It just shows what I wish I could tell my computer.
Questions About Recursion and Promises:
1) Should I be worried in the first place about going into the next recursive loop with a promise not yet resolved?
2) If not, what is a clean way to keep this function decomposition and force each recursive loop to wait for the resolution of the last call?
Recursion and Promises can seem wizard-level-95 magical sometimes... that's all I'm saying. Question-Done.