2016-07-15 20 views
-1

我熟悉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")}) 
+3

對15000行(!!)的調用將與上面的\ *同步,所以如果沒有它們,我們真的不能幫助你(當然,引用它們將是無用的)。你必須把它削減到[mcve](在此期間你可能會弄清楚)。 (\ *記住 - 承諾*解析*是異步的,而不是承諾安裝。) –

+0

只有當函數真的很長時纔會發生? – Barmar

+0

請確認在Chrome開發工具中選中了「異步」複選框。 – Ben

回答

-1

傳遞給Promise構造函數的執行功能被立即執行。

因此,調用堆棧很可能被執行程序功能吹襲。

每次對15k行進行50%(二分搜索),直到錯誤未被拋出找出​​問題。

+0

我不認爲這是這種情況,對'a100413'的呼叫不通過,它甚至沒有達到創建承諾的路線 –

相關問題