【问题标题】:Javascript for loop with settimeout time change带有 settimeout 时间更改的 Javascript for 循环
【发布时间】:2020-05-29 00:54:06
【问题描述】:

所以我试图在 for 循环中增加超时时间,我在这里遵循了答案setTimeout with Loop in JavaScript,但是当我输出日期以检查时差时,setTimeout 的持续时间无法以毫秒为单位。

代码:

for (var count = 0; count < 12; count++) {
    (function(num){setTimeout(function() {
        console.log("Count = " + num + " Time: " + 1000 * num + " Stamp: " + new Date());
    }, 1000 * num)})(count);
}

正如您在控制台中看到的,它仍然在每个1000 触发console.log,而不是1000 * count

我希望以上内容有意义,并希望有人可以解释这种行为。

【问题讨论】:

  • 增加它。如果您不这样做,它们将同时被记录。
  • 你模拟一个setInterval

标签: javascript for-loop settimeout


【解决方案1】:

代码按预期工作。

所有的定时器几乎都是在异步的同时设置的。因此,定时器设置完毕,代码继续加载其他定时器,无需等待代码执行。

第一个计时器将在 1 秒后关闭。

第二个计时器将在 2 秒后关闭。但是在设置定时器两秒后,也就是设置定时器 1 的时间。

等等。

因此,每个计时器都以 1000 * 计数触发。

【讨论】:

  • 非常感谢您的解释。但是如何在每次迭代后让它按照我想要的方式工作呢?这意味着我如何从上一次迭代中以毫秒为单位触发超时..
  • 而不是同时设置所有计时器,而是在回调中设置它们,这是时间过去后将触发的代码
【解决方案2】:

这就是你要找的吗?将每次迭代的时间增加 1 秒 * 一些计数

let i = 0;
loop = () => {
  setTimeout(() => {
    console.log("Count = " + i + " Time: " + 1000 * i);
    i++;
    if (i < 10) {
      loop();
    }
  }, i * 1000)
};
loop();

这是REPL,你可以点击运行

解释:尝试运行这段代码

for (var i = 1; i < 5; i++) {
    setTimeout(() => console.log(i), 1000)
} 

我们希望输出是 1 2 3 4 但实际上是 5 5 5 5,这是因为 js 运行时引擎不会等待 settimeout 完成而是将其传递到 Web API 并在那里排队,所以for 循环首先执行使 i = 5,然后在稍后的时间点 Web API 触发设置超时功能。你可以详细了解这个here

【讨论】:

  • 这太完美了!你能解释一下为什么会这样吗?
  • 是的,让我在答案中添加解释
  • @pavanskipo 添加说明后,请移除水平scollbar。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
相关资源
最近更新 更多