语言:JavaScript
递归 - 不是我的最爱话题。
Promise - 它们可以变得混乱。
递归 + Promise - 我需要在一个带垫子的房间里编程。
我做了这个小的JS Fiddle谜题,我称之为 递归乐园,这是一种把问题简化成有趣的事情来保持理智的喜剧方式。希望你们能从我的痛苦中笑出来 :)
问题:
每个递归调用都依赖于上一个调用的结果,但为了获得结果,我必须运行异步任务并将该结果用于其他子任务。
"递归乐园"帮助我将问题归纳为 - 原始递归循环在继续使用未定义值作为子任务仍在执行。
乐园 - 循环收集(-99)到99之间的随机数。一旦最后一个数字与新数字之间的差异为正数,乐趣就结束了。
打印"Made it here 1...Made it here 6"应该表明子任务已正确处理,我们有一个值用于下一个循环。
目前它打印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);
注意 - 对我的可悲的返回语句 return num;
表达了我希望能告诉计算机的内容。
有关递归和 Promise 的问题:
1)我是否应该担心在承诺未解决的情况下进入下一个递归循环?
2)如果不用担心,有没有一种干净的方法来保持这个函数的分解,并强制每个递归循环等待上一次调用的解决?
递归和 Promise 有时似乎是巫师级别95的魔法…这就是我想说的。问题解决了。