我实现了一个可以递归执行功能的函数。因为它有时需要异步执行操作,所以我不能使用简单的for
/ while
循环,而需要使用递归函数调用。
在非常抽象的代码段中,这意味着:
function doStuff(){
// async or sync things -> depends on several circumstances
doStuff();
}
doStuff();
这很好。但是,正如您可能期望的那样,当超过最大递归调用限制时,这会导致问题。有时我需要处理25,000多个电话,这在最新的Firefox(50.0a2)中导致
InternalError: too much recursion
。我发现捕获InternalError并使用超时重新触发回调是可行的:
function doStuff(){
// async or sync things -> depends on several circumstances
try{
doStuff();
} catch(e if e instanceof InternalError){
setTimeout(function(){
doStuff();
}.bind(this), 25);
}
}
doStuff();
但这看起来很丑陋。因此,我想问自己,解决这种情况的首选方法是什么-当您无法处理循环中的事情而需要使用递归函数调用时?
最佳答案
将代码转换为异步代码。在这种情况下,您的调用栈不会很深
function doStuff(){
setTimeout(doStuff, 0);
}
doStuff();
关于javascript - 防止InternalError:过多的递归,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39248517/