我熟悉maximum call stack exceeded
錯誤,但是當我看到它之前,我總是有一個很大的堆棧跟蹤,它明顯是什麼引起的。超出最大調用堆棧 - 在進行任何調用之前
在這種情況下,我的堆棧跟蹤爲1個深度,就像在撥打電話時它在撥打電話前失敗一樣。
有一件事我沒有注意到,被調用函數的Function.length
屬性沒有聲明一個數字值 - 它聲明瞭Maximum call stack exceeded
錯誤。
有問題的函數具有零個參數,但不會返回一個承諾,需要一個大的功能:
var a100413 = function() {
return new Promise(function(resolve, reject){
//about 15000 lines
})
}
又承諾有許多其他的承諾和函數定義。
編輯: 看起來像這種情況,當你窩承諾131層深,但是 - 它在第一次調用test()
前確實發生了 - 也許有,試圖執行的代碼預編譯器?我使用鉻,如果有任何區別
我認識到,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")})
對15000行(!!)的調用將與上面的\ *同步,所以如果沒有它們,我們真的不能幫助你(當然,引用它們將是無用的)。你必須把它削減到[mcve](在此期間你可能會弄清楚)。 (\ *記住 - 承諾*解析*是異步的,而不是承諾安裝。) –
只有當函數真的很長時纔會發生? – Barmar
請確認在Chrome開發工具中選中了「異步」複選框。 – Ben