2013-01-04 182 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); 

当你把它作为一个功能,那么只要你告诉它超时可以调用它 - 在你的情况下,一秒钟后。这样做没有包装功能,现在调用相同的代码