我熟悉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")})
答案 0 :(得分:-1)
传递给Promise
构造函数的执行函数立即执行。
因此,调用堆栈很可能被执行程序函数破坏。
一次减去15k行50%(二进制搜索),直到没有抛出错误来找到问题。