2013-01-04 179 views
2

我有以下代碼。它會導致堆棧溢出異常。setTimeout導致堆棧溢出

任何想法我做錯了什麼?

var myApi = {  

     rawData: null, 

     initData: function() { 
       // ajax call to get data and populate myApi.rawData, max 10 seconds 
     }, 

     waitForRawData: function(callback) { 
       if(myApi.rawData === null || myApi.rawData.length ===0) { 
       window.setTimeout(myApi.waitForRawData(callback),1000); // complain this line stack overflow 
       }else{ 
        callback(); 
       }    
     }, 

     updateHtmlWithNewData: function() { 
       // base on myApi.rawData update html element 
     }, 
     workflow: function() { // this function call is invoke from page 
       myApi.initData(); 
       myApi.waitForRawData(myApi.updateHtmlWithNewData); 
     } 
} 

回答

5

你有一個無限循環。

setTimeout期望第一個參數是一個回調函數 - 您實際上在那裏調用waitForRawData函數。它會立即再次自我調用,它會立即再次自我調用,這......你明白了。

這樣做:

window.setTimeout(function() { myApi.waitForRawData(callback) },1000); 

當你把它作爲一個功能,那麼只要你告訴它超時可以調用它 - 在你的情況下,一秒鐘後。這樣做沒有包裝功能,現在調用相同的代碼