Javascript 更改console.log in循环的速度

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

我想在我的循环中减慢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(),但我不希望启动延迟)

最简单的方法是在每次再次运行更新之前引入超时

// 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的代码,它就可以正常工作了),不管怎样,用一个全局布尔标志就可以很容易地解决这个问题。我个人不会按照他的建议去做,但很明显,你会选择最适合你的:)