超出最大呼叫堆栈 - 在进行任何呼叫之前

时间:2016-07-15 16:39:10

标签: javascript asynchronous

我熟悉maximum call stack exceeded错误,但是当我看到之前我总是有一个很大的堆栈跟踪,很明显是什么导致了它。

在这种情况下,我的堆栈跟踪深度为1,就像我进行呼叫一样,它在呼叫通过之前失败。

我注意到的一件事是,被调用函数的Function.length属性不会声明数值 - 它会指出Maximum call stack exceeded错误。

有问题的函数没有参数,但确实返回了一个带有大函数的promise:

var a100413 = function () {
  return new Promise(function(resolve, reject){
    //about 15000 lines
  })
}

承诺反过来有许多其他承诺和功能定义。

编辑: 看起来这种情况发生在你将131层深层的承诺嵌套时,但它确实发生在第一次调用test()之前 - 也许有一个预编译器试图执行代码?如果这有任何区别,我会使用chrome

我认识到131层嵌套是一个糟糕的程序结构,但在这种情况下很难避免,我的印象是,使用异步代码我不需要担心堆栈大小

function test(){
return new Promise(function(resolve, reject){   
   //repeated another 127 times
   //...
    function test(){
        return new Promise(function(resolve, reject){       
            function test(){
                return new Promise(function(resolve, reject){       
                    function test(){
                        return new Promise(function(resolve, reject){   
                            console.log("test")
                            resolve();
                        })
                    }
                    return Promise.resolve(true).then(test).then(resolve)
                })
            }
            return Promise.resolve(true).then(test).then(resolve)
        })
    }   
    //.....
    return Promise.resolve(true).then(test).then(resolve)
})
}   
test().then(function(){console.log("done")})

1 个答案:

答案 0 :(得分:-1)

传递给Promise构造函数的执行函数立即执行。

因此,调用堆栈很可能被执行程序函数破坏。

一次减去15k行50%(二进制搜索),直到没有抛出错误来找到问题。