Javascript 更改console.log in循环的速度
我想在我的循环中减慢console.log的速度Javascript 更改console.log in循环的速度,javascript,Javascript,我想在我的循环中减慢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(co
// 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(),但我不希望启动延迟)最简单的方法是在每次再次运行更新之前引入超时
// 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秒,它可以确保没有重叠。首先创建一个变量来存储最后一个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
如果要在
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();
}
setTimeout()
几乎是您唯一的选择。(好的,或者setInterval()
)是的,太好了!它正在做我想做的事情,但就内存分配而言,这不是一个糟糕的做法吗?(我不知道,这就是我问的原因。)不,你使用的唯一内存是存储上次迭代的纪元时间,它只是一个整数。我有一个,当我停止歌曲时,update()仍在运行!(但是有了Rob Brander的代码,它就可以正常工作了),不管怎样,用一个全局布尔标志就可以很容易地解决这个问题。我个人不会按照他的建议去做,但很明显,你会选择最适合你的:)