我实现了一个可以递归执行功能的函数。因为它有时需要异步执行操作,所以我不能使用简单的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/

10-14 19:21