2016-04-27 31 views
1

我想的console.log減緩我的循環改變的console.log的速度環

// function update to actualize value 
function update() { 
    requestAnimationFrame(update); 
    analyser.getByteFrequencyData(data); 

    var count=0; 
    for (var i=data.length; i--;) { 
    count+=data[i]; 
     if(count >= 1) { 
      console.log(data); 
     } 
    }; 
} 

例如,立刻顯示出一個的console.log,然後,每一個,5S ,我們該怎麼辦那? (也許用的setTimeout(),但我不希望延遲啓動)

+2

'setTimeout()'幾乎是您唯一的選擇。 (那麼或'setInterval()'。) – Pointy

回答

1

首先創建一個變量來存儲上一次console.log的時間。接下來,每次您console.log一個值時更新該變量。最後,添加一個檢查閾值。

var lastOutput = 0; // Setting this to 0 initially will ensure it runs immediately 
var outputThreshold = 500; // in milliseconds 

function update() { 
    requestAnimationFrame(update); 
    analyser.getByteFrequencyData(data); 

    if (new Date().valueOf() - lastOutput > outputThreshold) { 
     // threshold met, output and update 
     var count=0; 
     for (var i=data.length; i--;) { 
     count+=data[i]; 
     if(count >= 1) { 
      console.log(data); 
     } 
     }; 
     lastOutput = new Date().valueOf(); 
    } 
} 

update(); // fire first call to update, after that requestAnimationFrame() will handle future calls 
+0

是的,太棒了!它做我想做的事情,但是從內存分配的角度來看,這不是一個糟糕的實踐嗎? (我不知道,這就是我問的原因)。 – idkn

+1

不,唯一使用的內存是存儲最後一次迭代的紀元時間,這只是一個整數。 –

2

最簡單的方法是每次運行再次更新之前推出超時...

// function update to actualize value 
function update() { 
    analyser.getByteFrequencyData(data); 

    var count=0; 

    for (var i=data.length; i--;) { 
     count+=data[i]; 
     if(count >= 1) { 
      console.log(data); 
     } 
    }; 

    requestAnimationFrame(function() { 
     setTimeout(update, 5000); 
    }); 
} 

我所用setTimeout()優先於setInterval()這樣做(以及將呼叫移至該函數的結尾)將確保一切都已完成,然後開始5秒暫停。它確保沒有重疊,如果前面的代碼需要超過5秒。

+0

我有一個

+1

這將很容易與全局布爾標誌固定。我不會做他自己建議的事情,但是顯然你會選擇最適合你的東西:) – Archer

0

如果你想要的時間延遲for循環,你可以這樣做:

function update() { 
    requestAnimationFrame(update); 
    analyser.getByteFrequencyData(data); 

    var i = data.length - 1, count = 0; 
    function logger() { 
     count += data[i]; 
     if (count >= 1) 
     console.log(data); 
     if (i-- >= 0) 
     setTimeout(logger, 500); 
    } 
    logger(); 
} 

現在,一切都將是非常混亂的,因爲你使用是requestAnimationFrame()安排整個事情的另一個迭代;那真的不再有意義了。您可能會希望等待記錄過程完成:

function update() { 
    analyser.getByteFrequencyData(data); 

    var i = data.length - 1, count = 0; 
    function logger() { 
     count += data[i]; 
     if (count >= 1) 
     console.log(data); 
     if (i-- >= 0) 
     setTimeout(logger, 500); 
     else 
     requestAnimationFrame(update); 
    } 
    logger(); 
}