2016-12-28 77 views
2

我想創建setTimeout,將調用函數,然後函數將再次調用setTimeout但具有不同的區間值。動態setTimeout導致「最大調用堆棧超出」錯誤

問題是,它似乎陷入了無限循環。

這些都是基本變量:

var interval = 1500; 
var elapsed = 0; 
var totalTimer = 40000; 
var startTime = null; 

這是函數:

function playLights(){ 
     startTime = Date.now(); 
     interval = (totalTimer-elapsed) * 0.026; 
     lights[0].color(0, 91, 68, 3500, 0); 
     lights[1].color(0, 91, 68, 3500, 0); 
     setTimeout(function(){ 
      lights[0].color(0, 100, 100, 3500, 0); 
      lights[1].color(0, 100, 100, 3500, 0); 
     }, 300); 
     elapsed = Date.now() - startTime; 
     if((Date.now() - startTime) < 37000){ 
      setTimeout(playLights(), interval.toFixed()); 
     } 
     console.log("Interval: "+interval+" ,Elapsed: "+elapsed); 
    } 

當動作發生了,我叫playLights();

什麼是應該發生的:

1)炸彈在遊戲中獲得種植,

2)它必須調用playLights(),

3)它必須得到當前的時間,並保存它,

4)必須確定區間,這樣以來它的第一個電話 - 它必須是1040毫秒。

5)它必須閃爍的顏色。 (現在不重要)

6)然後它必須根據currentDate - storedDate計算經過了多少時間。

7)然後,它必須檢查經過時間大於37000毫秒(37秒),

如果是 - 對自己的setTimeout。

如果沒有 - 只是沒有。

我不斷收到由Node.js的

超過最大調用堆棧難道我犯錯的地方,導致其陷入無限循環?

+4

'setTimeout(playLights(),''應該是'setTimeout(playLights,' - 您正在運行該方法並傳遞其結果,rath呃比將它作爲參考傳遞給'setTimeout'。 – Blorgbeard

+0

@Blorgbeard輝煌,謝謝。這解決了這個問題。 – AleRemote225

回答

2

有在你的代碼幾次失誤,例如
在您的功能設置startTimeDate.now()這是正常的,但是!在下一刻您將elapsed設置爲Date.now() - startTime,因此它總是0,因爲startTime等於Date.now()。 然後你在if部分的陳述中只是做同樣的事情,它總會是真的。 SO基本上沒有變化,並導致無限循環等。 您可以在您的主要功能中設置startTime,或通過playLights()函數傳遞它。 最後,你必須通過startTimesetTimeout()callback功能,你可以做到這一點,像這樣:

`setTimeout(function() {playLights(startTime);}, interval.toFixed());` 

所以您的代碼會是這個樣子:

function playLights(startTime) { 
    interval = (totalTimer-elapsed) * 0.026; 
    lights[0].color(0, 91, 68, 3500, 0); 
    lights[1].color(0, 91, 68, 3500, 0); 
    setTimeout(function() { 
     lights[0].color(0, 100, 100, 3500, 0); 
     lights[1].color(0, 100, 100, 3500, 0); 
    }, 300); 
    elapsed = Date.now() - startTime; 
    if (elapsed < 37000) { 
     setTimeout(function(){playLights(startTime)}, interval.toFixed()); 
    } 
    console.log("Interval: "+interval+" ,Elapsed: "+elapsed); 
} 

你可以這樣調用:

playLights(Date.now()); 
相關問題