【发布时间】:2016-01-10 22:14:15
【问题描述】:
语言:JavaScript
递归 - 不是我最喜欢的主题。
Promises - 它们可能会让人感到困惑。
递归 + 承诺 - 我需要在有软垫的房间里编程。
我制作了这个我称之为 The RecursiveFunHouse 的小 JS Fiddle 拼图,作为通过将问题简化为愚蠢的事情来保持理智的喜剧方式。希望你们能从我的痛苦中笑出来:)
问题:
每个递归调用都依赖于前一个调用的结果,但为了获得结果,我必须运行一个异步任务并将该结果用于其他子任务。
“Recursive Fun House”帮助我将问题归结为这个问题 - 由于子任务仍在执行,原始递归循环以未定义的值继续。
The Fun House - 循环收集 (-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; 它只是显示了我希望我能告诉我的计算机的内容。
关于递归和承诺的问题:
1) 首先我是否应该担心进入下一个递归循环,而承诺尚未解决?
2) 如果不是,那么保持此函数分解并强制每个递归循环等待最后一次调用的解决的干净方法是什么?
递归和承诺有时看起来像巫师级的 95 级魔法......这就是我要说的。问题完成。
【问题讨论】:
-
performSideTasks 应该返回 someAsynTask Promise 本身,以便主函数可以获取 .then() 内部的 num 值
标签: javascript recursion